diff --git a/Makefile b/Makefile index 765000ee0f12f412fb5563a2b30dbaf277a3b569..7726ce627b9ab52ae833e5f8dee9698c9cbba02d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ #/** @file -# * Copyright (c) 2019-2023 Arm Limited or its affiliates. All rights reserved. +# * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. # * SPDX-License-Identifier : Apache-2.0 # * # * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/README.md b/README.md index bb0e543215e5f6ae8888f118a4f7af6ad8fec9f1..15ce06335d5001192e1a44f95c3874522c68f05d 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,35 @@ # System Control and Management Interface - Compliance Suite ## Introduction -**System Control and Management Interface** (SCMI) is a set of Operating System-independent software interfaces that are used in system management. +**System Control and Management Interface (SCMI), which is a set of operating system-independent software interfaces that are used in system management. SCMI is extensible and currently provides interfaces for: -For more information, download the [SCMI Platform Design Document](https://developer.arm.com/documentation/den0056/b/?lang=en). + - Discovery and self-description of the interfaces it supports. + - Power domain management, which is the ability to place a given device or domain into the various power-saving states that it supports. + - Performance management, which is the ability to control the performance of a domain that is composed of compute engines such as application processors (APs), GPUs, or other accelerators. + - Clock management, which is the ability to set and inquire rates on platform-managed clocks. + - Sensor management, which is the ability to read sensor data, and be notified of sensor value changes. + - Reset domain management, which is the ability to place a given device or domain into various reset states. + - Voltage domain management, which is the ability to configure and manage the voltage level of a domain that provides voltage supply to a group of components. + - Power capping and monitoring, which is the ability to configure, set power caps and monitor the power consumption of power capping domains. + - Pin control protocol, which is intended for controlling pins or groups of pins, and their configuration -## SCMI Compliance suite +For more information, download the [SCMI Platform Design Document](https://developer.arm.com/documentation/den0056/e/?lang=en). + +## SCMI - Architecture Compliance Suite SCMI compliance suite is a collection of self-checking, portable C tests. SCMI compliance suite enables adopters of SCMI Platform Design Document \(PDD\) to test their own implementations. It provides a predefined library of tests and a test framework to execute these tests. The test suite can be adapted to different platforms. It also enables the extension of the current test library to include platform-specific custom commands and custom protocols. ## Release details - - Code quality: REL v2.0. - - The tests are written for version 3.0 of the SCMI PDD. - - The compliance suite maintains backward compatibility with version 2.0 and 1.0 of the SCMI PDD. + - Code quality: REL v3.2 BETA-0. + - The tests are written for version 3.2 BETA-2 of the SCMI PDD. + - The compliance suite maintains backward compatibility with version 3.1, 3.0, 2.0 and 1.0 of the SCMI PDD. - The compliance suite is not a substitute for design verification. - The compliance suite is verified against [SCP-firmware](https://github.com/ARM-software/SCP-firmware). - - To know about the gaps in the test coverage, see the [Test checklist]. -## GitHub branch +## Gitlab branch Use the master branch to get the latest version of the code with bug fixes and new features. ## Test scenarios - -The mapping of the rules in the specification to the test cases and the steps followed in the tests are mentioned in the [Test checklist]. +The mapping of the rules in the specification to the test cases and the steps followed in the tests are mentioned in the [Test Scenario]. ## Getting started See the [User Guide] for instructions to adapt, build and run the test suite. @@ -35,16 +43,16 @@ The software is provided under Apache 2.0 license. Contributions to this project ## Feedback and support Arm values and welcomes any feedback and contributions to this project. -* For feedback, use the issue tracker that is associated with this project [Issue Tracker](https://github.com/ARM-software/scmi-tests/issues). +* For feedback, use the issue tracker that is associated with this project [Issue Tracker](https://gitlab.arm.com/tests/scmi-tests/-/issues). * For support, send your queries to [support-scmi-acs@arm.com](mailto:support-scmi-acs@arm.com). * Arm licensees can contact Arm directly through their partner managers. -* Arm welcomes code contributions through GitHub pull requests. +* Arm welcomes code contributions through Gitlab pull requests. - - - - - - - - - - - - - - - - - - - - -_Copyright (c) 2021, Arm Limited and Contributors. All rights reserved._ +_Copyright (c) 2021, 2023-2024, Arm Limited and Contributors. All rights reserved._ -[User Guide]: ./docs/user_guide.md "SCMI Test Suite User Guide" -[Validation Methodology Document]: ./docs/Arm_SCMI_Validation_Methodology.pdf "SCMI Test Suite Design" -[Test checklist]: ./docs/scmi_testlist.md "SCMI Test Specification" +[User Guide]: ./docs/arm_system_control_and_management_interface_test_suite_user_guide.pdf "SCMI Test Suite User Guide" +[Validation Methodology Document]: ./docs/arm_system_control_and_management_interface_test_suite_validation_methodology.pdf "SCMI Test Suite Design" +[Test Scenario]: ./docs/arm_system_control_and_management_interface_test_suite_test_scenario.pdf "SCMI Test Scenario" diff --git a/baremetal_app/app.c b/baremetal_app/app.c index 0f6f2d85465c1a555183e2e3a638985b038f4fc0..97112c3cf14cde7ae8a6bbb6117c4b13adb9c8c1 100644 --- a/baremetal_app/app.c +++ b/baremetal_app/app.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -78,6 +78,16 @@ void arm_scmi_agent_execute(void *agent_info) val_voltage_execute_tests(); #endif +#ifdef POWERCAP_PROTOCOL + val_print(VAL_PRINT_ERR, "\n\n *** Starting POWERCAP tests *** "); + val_powercap_execute_tests(); +#endif + +#ifdef PIN_CONTROL_PROTOCOL + val_print(VAL_PRINT_ERR, "\n\n *** Starting PIN CONTROL tests *** "); + val_pin_control_execute_tests(); +#endif + num_pass = val_get_test_passed(); num_fail = val_get_test_failed(); num_skip = val_get_test_skipped(); diff --git a/docs/ARM_SCMI_Validation_Methodology.pdf b/docs/ARM_SCMI_Validation_Methodology.pdf deleted file mode 100644 index 621f533018c713caf61066a8693b89250558577b..0000000000000000000000000000000000000000 Binary files a/docs/ARM_SCMI_Validation_Methodology.pdf and /dev/null differ diff --git a/docs/arm_system_control_and_management_interface_test_suite_test_scenario.pdf b/docs/arm_system_control_and_management_interface_test_suite_test_scenario.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1adc5a25e6ab188aef098957afb7ec075773d3c6 Binary files /dev/null and b/docs/arm_system_control_and_management_interface_test_suite_test_scenario.pdf differ diff --git a/docs/arm_system_control_and_management_interface_test_suite_user_guide.pdf b/docs/arm_system_control_and_management_interface_test_suite_user_guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..683089d684b0ce2fc5b608ee7de8264468f67900 Binary files /dev/null and b/docs/arm_system_control_and_management_interface_test_suite_user_guide.pdf differ diff --git a/docs/arm_system_control_and_management_interface_test_suite_validation_methodology.pdf b/docs/arm_system_control_and_management_interface_test_suite_validation_methodology.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8abe7ea2d3ba7066bc21f3f97250b2c24b1590e1 Binary files /dev/null and b/docs/arm_system_control_and_management_interface_test_suite_validation_methodology.pdf differ diff --git a/docs/guide_linux_testing.md b/docs/guide_linux_testing.md index 7e0c86770ab87955e7a723ea6debea22130e10dc..570736c6338773c7fc11ae912eea02edb1d97d45 100644 --- a/docs/guide_linux_testing.md +++ b/docs/guide_linux_testing.md @@ -68,7 +68,7 @@ The current change in mailbox test driver is not an ideal solution. A better sol ### SCMI Raw mode support Alternatively, on supported Kernels, it is possible to configure the SCMI test agent on any target to use the Kernel SCMI Raw access mode; in such a case the Kernel must be rebuild enabling CONFIG_ARM_SCMI_RAW_MODE_SUPPORT=y and the SCMI ACS suite itself must be rebuild specifying TRANS=raw on the make command line, like in: -> `make PLAT=linux TRANS=raw TARGET=sgm776 PROTOCOLS=base,clock,power_domain,performance,system_power,sensor,voltage,reset VERBOSE=1` +> `make PLAT=linux TRANS=raw TARGET=sgm776 PROTOCOLS=base,clock,power_domain,performance,system_power,sensor,voltage,reset,powercap,pin_control VERBOSE=1` If TRANS= is not specified the usual Mailbox driver backend is instead compiled into the SCMI ACS suite. diff --git a/docs/scmi_testlist.md b/docs/scmi_testlist.md deleted file mode 100644 index 3612070b73800494c78ca8bd5ce257b80d618c90..0000000000000000000000000000000000000000 --- a/docs/scmi_testlist.md +++ /dev/null @@ -1,241 +0,0 @@ -**SCMI Tests - Scenario document** -=================================== -Table of Contents: -- [Introduction](#introduction) -- [General Rules](#general-rules) -- [Base Protocol Tests](#base-protocol-tests) -- [Power Domain Management Protocol Tests](#power-domain-management-protocol-tests) -- [System Power Management Protocol Tests](#system-power-management-protocol-tests) -- [Performance Domain Management Protocol Tests](#performance-domain-management-protocol-tests) -- [Clock Management Protocol Tests](#clock-management-protocol-tests) -- [Sensor Management Protocol Tests](#sensor-management-protocol-tests) -- [Reset Management Protocol Tests](#reset-management-protocol-tests) -- [Voltage Management Protocol Tests](#voltage-management-protocol-tests) - -Introduction -------- -This document outlines the test scenarios and how individual test cases are implemented in the current version of the SCMI test suite. - -General Rules -------- -In writing the tests, these rules have been followed: - ----------- - -> All test case identifiers **must** be unique. - ----------- - -> Every test case compares return values against expected results that are provided by the user through the platform properties to determine a PASS or FAIL verdict. In case some protocols are not supported by particular platform, those test cases need to be skipped. - ----------- - -> All message fields that are defined by specification as 'Reserved, Must be Zero' **must** be checked and reported as compliance failure if not adhered to. - ----------- - -> The SCMI test library comprises of a collection of test suites that are grouped per protocol. - ----------- - -> Some tests might require a **pre-condition** or a **post-condition** check. These checks are captured as part of test cases that **must** come immediately preceding or just after the relevant test case payload function. - -> A typical example for a test case that needs a precondition is the get command which has a set command as a precondition. - -> A typical example for a test case that needs a postcondition is a subscribe for notification command which has unsubscribe for notification command as the postcondition. - - -Base Protocol Tests ----------- -This section outlines the test specification for SCMI Base Protocol. - -| Test ID | Test Intent | Verification Steps | Comments/Commands Used | -| ---------- | --------------------- | ------------------- | ----------------------- | -| test_b001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test_b002 | Query the protocol attributes. | Check num\_agents and num\_protocols against expected value. | PROTOCOL\_ATTRIBUTES | -| test_b003 | Query for mandatory command support. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_b004 | Send invalid command id for base protocol.
Query the protocol message attributes with invalid msg_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_b005 | Query for vendor information. | Check vendor name against expected value. | BASE\_DISCOVER\_VENDOR | -| test_b006 | Pre-Condition: BASE\_DISCOVER\_SUB\_VENDOR support.
Query for sub vendor information. | Check sub vendor name against expected value. | PROTOCOL\_MESSAGE\_ATTRIBUTES
BASE\_DISCOVER\_SUB\_VENDOR | -| test_b007 | Query for vendor specific implementation version. | Check implementation version against expected value. | BASE\_DISCOVER\_IMPLEMENTATION\_VERSION| -| test_b008 | Query protocol list with valid and invalid skip value. | 1. Check protocol list against expected value for valid skip value.
2. Check INAVLID\_PARAMETERS return status for invalid skip value. | BASE\_DISCOVER\_LIST\_PROTOCOLS | -| test_b009 | Pre-Condition: BASE\_DISCOVER\_AGENT support.
Query for agent name with valid and invalid agent id. | 1. Check agent name starts with "platform" when agent id = 0.
2. Check agent name with expected value for valid agent id.
3. Check agent name matches expected value when agent_id = 0xFFFFFFFF.
4. Check NOT_FOUND return status for invalid agent id. | PROTOCOL\_MESSAGE\_ATTRIBUTES
BASE\_DISCOVER\_AGENT | -| test_b010 | Pre-Condition: BASE\_NOTIFY\_ERRORS support.
1. Register and Unregister for error notification from platform.
2. Send command with invalid parameters. | 1. Check SUCCESS status returned for register and unregister.
2. Check INVALID\_PARAMETERS return status for invalid notify_enable. | PROTOCOL\_MESSAGE\_ATTRIBUTES
BASE\_NOTIFY\_ERRORS | -| test_b011 | Pre-Condition: BASE\_SET\_DEVICE\_PERMISSIONS support.
1. Try setting device permissions for invalid agent.
2. Send command with invalid parameters.
3. Remove acces of a invalid device.
| 1. Check NOT_FOUND status is returned.
2. Check INVALID_PARAMETERS status is returned.
3. Check NOT_FOUND status is returned.| PROTOCOL\_MESSAGE\_ATTRIBUTES
BASE\_SET\_DEVICE\_PERMISSIONS | -| test_b012 | Pre-Condition: BASE\_SET\_DEVICE\_PERMISSIONS support.
1. Deny agent access to a valid device.
2. Try accessing denied device.
3. Restore the protocol access with BASE\_SET\_DEVICE\_PERMISSIONS. | 1. Check NOT_FOUND status is returned when access denied agent.
2. Agent should be able to access device after permissions restored.
| BASE\_SET\_DEVICE\_PERMISSIONS | -| test_b013 | Pre-Condition: BASE\_SET\_PROTOCOL\_PERMISSIONS support.
1. Try setting protocol permission for invalid agent.
2. Try to remove access for base\_protocol.
3. Send command with invalid parameters.
4. Remove access of invalid device. | 1. Check NOT\_FOUND status is returned.
2. Check NOT\_FOUND status is returned.
3. Check INVALID\_PARAMETERS is returned.
4. Check NOT_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES
BASE\_SET\_PROTOCOL\_PERMISSIONS | -| test_b014 | Pre-Condition: BASE\_SET\_PROTOCOL\_PERMISSIONS support.
1. Deny agent access to a valid protocol.
2. Try accessing command of denied protocol.
3. Restore the protocol access with BASE\_SET\_PROTOCOL\_PERMISSIONS. | 1. Check NOT_FOUND status is returned when access denied protocol.
2. Agent should be able to access protocol after permissions restored.
| BASE\_SET\_PROTOCOL\_PERMISSIONS | -| test_b015 | Pre-Condition: BASE\_RESET\_AGENT\_CONFIGURATION support.
1. Try resetting device and protocol permissions for invalid agent.
2. Send command with invalid flags value.
| 1. Check NOT_FOUND status is returned.
2. Check INVALID_PARAMETERS status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES
BASE\_RESET\_AGENT\_CONFIGURATION | -| test_b016 | Pre-Condition: BASE\_SET\_DEVICE\_PERMISSIONS and BASE\_RESET\_AGENT\_CONFIGURATION support.
1. Deny agent access to a valid device.
2. Try accessing denied device.
3. Restore the device access with BASE\_RESET\_AGENT\_CONFIGURATION. | 1. Check NOT_FOUND status is returned when access denied device.
2. Agent should be able to access device after permissions restored.
| BASE\_SET\_DEVICE\_PERMISSIONS
BASE\_RESET\_AGENT\_CONFIGURATION | -| test_b017 | Pre-Condition: BASE\_SET\_PROTOCOL\_PERMISSIONS and BASE\_RESET\_AGENT\_CONFIGURATION support.
1. Deny agent access to a valid protocol.
2. Try accessing command of denied protocol.
3. Restore the protocol access with BASE\_RESET\_AGENT\_CONFIGURATION. | 1. Check NOT_FOUND status is returned when access denied protocol.
2. Agent should be able to access protocol after permissions restored.
| BASE\_SET\_PROTOCOL\_PERMISSIONS
BASE\_RESET\_AGENT\_CONFIGURATION | - - -Power Domain Management Protocol Tests ---------- -This section outlines the test specification for SCMI Power Domain Management Protocol. - -| Test ID | Test Intent | Verification Step | Comments/Commands Used | -| ---------- | --------------------- | ------------------ | ----------------------- | -| test_p001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test_p002 | Query the protocol attributes. | Check power domain protocol attributes against expected values. | PROTOCOL\_ATTRIBUTES | -| test_p003 | Query for mandatory command availability. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_p004 | 1. Send invalid command id for power domain protocol.
2. Query the protocol message attributes with invalid msg_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_p005 | Query power domain attributes with valid power domain id. | Check power domain attributes with expected value for valid power domain id.| POWER\_DOMAIN\_ATTRIBUTES | -| test_p006 | Query power domain attributes with non-existent power domain id. | Check NOT_FOUND return status for non-existent power domain id. | POWER\_DOMAIN\_ATTRIBUTES | -| test_p007 | Pre-Condition: Power domain should support power state set.
Send command with invalid flags and power state value.| Check INVALID_PARAMETERS status is returned.| POWER\_STATE\_SET
POWER\_DOMAIN\_ATTRIBUTES | -| test_p008 | Send power state set command for not supported domain.| Check NOT\_SUPPORTED status is returned.| POWER\_STATE\_SET
POWER\_DOMAIN\_ATTRIBUTES | -| test_p009 | Try setting power state of non-existent power domain id | Check NOT_FOUND status is returned. | POWER\_STATE\_SET | -| test_p010 | Query power state get for valid domain id. | Check SUCCESS return status. | POWER\_STATE\_GET | -| test_p011 | Query power state get for non-existent power domain id. | Check NOT_FOUND return status for non-existent power domain id. | POWER\_STATE\_GET | -| test_p012 | Pre-Condition: POWER\_STATE\_NOTIFY support.
Send command with invalid notify_enable. | Check INVALID\_PARAMETERS status is returned. | POWER\_STATE\_NOTIFY
POWER\_DOMAIN\_ATTRIBUTES | -| test_p013 | Pre-Conditions: POWER\_STATE\_NOTIFY support.
Send command for not supported domain. | Check NOT\_SUPPORTED status is returned. | POWER\_STATE\_NOTIFY
POWER\_DOMAIN\_ATTRIBUTES | -| test_p014 | Pre-Condition: POWER\_STATE\_NOTIFY support.
Enable power state notification for non-existent domain. | Check NOT_FOUND status is returned | POWER\_STATE\_NOTIFY | -| test_p015 | Pre-Condition: POWER\_STATE\_CHANGE\_REQUESTED\_NOTIFY support
Invoke command with invalid notify_enable. | Check INVALID\_PARAMETERS status is returned. | POWER\_STATE\_CHANGE\_REQUESTED\_NOTIFY | -| test_p016 | Pre-Condition: POWER\_STATE\_CHANGE\_REQUESTED\_NOTIFY support
Set power state change notification for non-existent power domain. | Check NOT\_FOUND status is returned. | POWER\_STATE\_CHANGE\_REQUESTED\_NOTIFY | - -System Power Management Protocol Tests ---------- -This section outlines the test specification for SCMI System Power Management Protocol. - -| Test ID | Test Intent | Verification Step | Comments/Commands Used | -| ---------- | --------------------- | ------------------ | ----------------------- | -| test_s001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test_s002 | Query the protocol attributes. | Check attributes byte is zero. | PROTOCOL\_ATTRIBUTES | -| test_s003 | Query for mandatory command availability. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_s004 | 1. Send invalid command id for system power protocol.
2. Query the protocol message attributes with invalid msg_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_s005 | Pre-Condition: SYSTEM\_POWER\_STATE\_SET support.
Query system power state set with invalid flag. | Check INVALID\_PARAMETERS status is returned. | SYSTEM\_POWER\_STATE\_SET | -| test_s006 | Pre-Condition: SYSTEM\_POWER\_STATE\_GET support.
Query system power state and check state with expected value. | Check SUCCESS status is returned. | SYSTEM_POWER_STATE_GET | -| test_s007 | Pre-Condition: SYSTEM\_POWER\_STATE\_NOTIFY support.
Query system power state notify with invalid notify\_enable. | Check INVALID\_PARAMETERS status is returned. | SYSTEM\_POWER\_STATE\_NOTIFY | - -Performance Domain Management Protocol Tests ---------- -This section outlines the test specification for SCMI Performance Domain Management Protocol. - -| Test ID | Test Intent | Verification Step | Comments/Commands Used | -| ---------- | --------------------- | ------------------ | ----------------------- | -| test_d001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test_d002 | Query the protocol attributes. | Check performance protocol attributes against expected values. | PROTOCOL\_ATTRIBUTES | -| test_d003 | Query for mandatory command availability. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_d004 | 1. Send invalid command id for performance protocol.
2. Query the protocol message attributes with invalid msg_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_d005 | Query performance domain attributes with valid performance domain id. | Check performance domain attributes with expected values.| PERFORMANCE\_DOMAIN\_ATTRIBUTES | -| test_d006 | Query performance domain attributes with non-existent performance domain id. | Check NOT_FOUND return status for non-existent performance domain id. | PERFORMANCE\_DOMAIN\_ATTRIBUTES | -| test_d007 | 1. Query performance describe level for all domains.
2. Query performance describe level with invalid level index | 1. Check SUCCESS status is returned.
2. Check INVALID\_PARAMETERS status is returned.| PERFORMANCE\_DESCRIBE\_LEVELS | -| test_d008 | Query performance describe level for non-existing performance domain. | Check NOT\_FOUND status is returned.| PERFORMANCE\_DESCRIBE\_LEVELS | -| test_d009 | 1. Get current performance limits.
2. Set new performance limits.
3.Read limits and verify with new performance limits.
4. Restore the default limits. | Check SUCCESS status is returned. | PERFORMANCE\_LIMITS\_SET
PERFORMANCE\_LIMITS\_GET | -| test_d010 | 1. Query with invalid maximum limit.
2. Query with invalid minimum limit.
3. Query with invalid minimum greater than maximum limit. | 1 & 2. Check OUT\_OF\_RANGE status is returned.
3. Check INVALID\_PARAMETERS status is returned. | PERFORMANCE\_LIMITS\_SET | -| test_d011 | 1. Query set limit with not-supported performance domain.
2. Query performance domain set limit with non-existent performance domain id. | 1. Check DENIED status is returned.
2. Check NOT\_FOUND status is returned. | PERFORMANCE\_LIMITS\_SET | -| test_d012 | Query performance domain get limit with non-existent performance domain id. | Check NOT\_FOUND status is returned. | PERFORMANCE\_LIMITS\_GET | -| test_d013 | 1. Get current performance level .
2. Set new performance level.
3.Read level and verify with new performance level.
4. Restore the default level. | Check SUCCESS status is returned. | PERFORMANCE\_LEVEL\_SET
PERFORMANCE\_LEVEL\_GET | -| test_d014 | 1. Query with performance level greater than maximum limit.
2. Query with performance level less than minimum limit. | Check OUT\_OF\_RANGE status is returned. | PERFORMANCE\_LEVEL\_SET | -| test_d015 | 1. Query set level with not-supported performance domain.
2. Query performance domain set level with non-existent performance domain id. | 1. Check DENIED status is returned.
2. Check NOT\_FOUND status is returned. | PERFORMANCE\_LEVEL\_SET | -| test_d016 | Query performance domain get level with non-existent performance domain id. | Check NOT\_FOUND status is returned. | PERFORMANCE\_LEVEL\_GET | -| test_d017 | Pre-Condition: PERFORMANCE\_NOTIFY\_LIMITS command support.
Query with invalid notify_enable. | Check INVALID\_PARAMETERS status is returned. | PERFORMANCE\_NOTIFY\_LIMITS | -| test_d018 | Pre-Condition: PERFORMANCE\_NOTIFY\_LIMITS command support.
1. Query notify limit with not-supported performance domain.
2. Query performance domain notify limit with non-existent performance domain id. | 1. Check NOT\_SUPPORTED status is returned.
2. Check NOT\_FOUND status is returned. | PERFORMANCE\_NOTIFY\_LIMITS | -| test_d019 | Pre-Condition: PERFORMANCE\_NOTIFY\_LEVEL command support.
Query with invalid notify_enable. | Check INVALID\_PARAMETERS status is returned. | PERFORMANCE\_NOTIFY\_LEVEL | -| test_d020 | Pre-Condition: PERFORMANCE\_NOTIFY\_LEVEL command support.
1. Query notify level with not-supported performance domain.
2. Query performance domain notify level with non-existent performance domain id. | 1. Check NOT\_SUPPORTED status is returned.
2. Check NOT\_FOUND status is returned. | PERFORMANCE\_NOTIFY\_LEVEL | -| test_d021 | Pre-Condition: PERFORMANCE\_DESCRIBE\_FASTCHANNEL command support.
Query describe fast channel for all valid domains. | Check SUCCESS status is returned.| PERFORMANCE\_DESCRIBE\_FASTCHANNEL | -| test_d022 | Pre-Condition: PERFORMANCE\_DESCRIBE\_FASTCHANNEL command support.
Query describe fast channel with non-existent performance domain id. | Check NOT\_FOUND status is returned. | PERFORMANCE\_DESCRIBE\_FASTCHANNEL | -| test_d023 | Pre-Condition: PERFORMANCE\_DESCRIBE\_FASTCHANNEL command support.
Query describe fast channel with non-existent performance message id. | Check NOT\_FOUND status is returned. | PERFORMANCE\_DESCRIBE\_FASTCHANNEL | -| test_d024 | Pre-Condition: PERFORMANCE\_DESCRIBE\_FASTCHANNEL command support.
Query describe fast channel with not-supported performance domain. | Check NOT\_SUPPORTED status is returned. | PERFORMANCE\_DESCRIBE\_FASTCHANNEL | -| test_d025 | Pre-Condition: PERFORMANCE\_DESCRIBE\_FASTCHANNEL command support.
Query describe fast channel with not-supported message id. | Check NOT\_SUPPORTED status is returned. | PERFORMANCE\_DESCRIBE\_FASTCHANNEL | -| test_d026 | 1. Get the domain which has limit change notify and set limit support.
2. Enable limit notification.
3. Get current performance limits for the domain.
4. Set new performance limits.
5. Check if notification of new limit is received & verify limits.
6. Disable limit change notification.
7. Restore the default limits | Check SUCCESS status is returned. | PERFORMANCE\_LIMITS\_SET
PERFORMANCE\_LIMITS\_GET
PERFORMANCE\_NOTIFY\_LIMITS | -| test_d027 | 1. Get the domain which has level change notify and set level support.
2. Enable level notification.
3. Get current performance level for the domain.
4. Set new performance level.
5. Check if notification of new level is received & verify level.
6. Disable level change notification.
7. Restore the default level | Check SUCCESS status is returned. | PERFORMANCE\_LEVEL\_SET
PERFORMANCE\_LEVEL\_GET
PERFORMANCE\_NOTIFY\_LEVEL | - -Clock Management Protocol Tests ---------- -This section outlines the test specification for SCMI Clock Management Protocol. - -| Test ID | Test Intent | Verification Step | Comments/Commands Used | -| ---------- | --------------------- | ------------------ | ----------------------- | -| test_c001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test_c002 | Query the protocol attributes. | Check clock protocol attributes against expected values. | PROTOCOL\_ATTRIBUTES | -| test_c003 | Query for mandatory command availability. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_c004 | 1. Send invalid command id for clock protocol.
2. Query the protocol message attributes with invalid msg_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_c005 | Query clock attributes for all system clocks. | Check clock attributes are returned. | CLOCK\_ATTRIBUTES | -| test_c006 | Query clock attributes with invalid clock id. | Check NOT\_FOUND status is returned.| CLOCK\_ATTRIBUTES | -| test_c007 | 1. Query clock describe rate for all system clocks.
2. Query clock describe rate with invalid rate index | 1. Check SUCCESS status is returned.
2. Check OUT\_OF\_RANGE status is returned.| CLOCK\_DESCRIBE\_RATES | -| test_c008 | Query clock describe rate for non-existing clock id. | Check NOT\_FOUND status is returned.| CLOCK\_DESCRIBE\_RATES | -| test_c009 | 1. Get current clock rates.
2. Set new clock rates in synchronous mode.
3. Get clock rates and verify with new rates.
4. Restore the default clock rates. | Check SUCCESS status is returned. | CLOCK\_RATE\_SET
CLOCK\_RATE\_GET | -| test_c010 | 1. Get current clock rates.
2. Set new clock rates in asynchronous mode.
3. Wait for delayed response and verify with new rates.
4. Restore the default clock rates. | Check SUCCESS status is returned. | CLOCK\_RATE\_SET
CLOCK\_RATE\_GET | -| test_c011 | 1. Query set clock rate with invalid rates.
2. Query set clock rate with invalid flags. | Check INVALID\_PARAMETERS status is returned. | CLOCK\_RATE\_SET | -| test_c012 | Set clock rate for invalid clock id. | Check NOT\_FOUND status is returned. | CLOCK\_RATE\_SET | -| test_c013 | Query clock rates for all system clocks. | Check clock rates are returned. | CLOCK\_RATE\_GET | -| test_c014 | Query clock rate for invalid clock id. | Check NOT\_FOUND status is returned. | CLOCK\_RATE\_GET | -| test_c015 | Configure clock with invalid attributes. | Check INVALID\_PARAMETERS status is returned. | CLOCK\_CONFIG\_SET | -| test_c016 | Configure clock for invalid clock id. | Check NOT\_FOUND status is returned. | CLOCK\_CONFIG\_SET | -| test_c017 | 1.Configure clock device with new state.
2. Get clock attributes and verify clock device state.
3. Restore the default clock device state | Check SUCCESS status is returned. | CLOCK\_CONFIG\_SET
CLOCK\_ATTRIBUTES | - -Sensor Management Protocol Tests ---------- -This section outlines the test specification for SCMI Sensor Management Protocol. - -| Test ID | Test Intent | Verification Step | Comments/Commands Used | -| ---------- | --------------------- | ------------------ | ----------------------- | -| test_m001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test_m002 | Query the protocol attributes. | Check num\_sensors against expected value. | PROTOCOL\_ATTRIBUTES | -| test_m003 | Query for mandatory command availability. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_m004 | 1. Send invalid command id for sensor protocol.
2. Query the protocol message attributes with invalid msg_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_m005 | 1. Query sensor descriptor.
2. Query sensor descriptor with invalid descriptor index. | 1. Check descriptor values against expected values.
2.Check INVALID\_PARAMETERS status is returned. | SENSOR\_DESCRIPTION\_GET | -| test_m006 | Pre-Condition: SENSOR\_TRIP\_POINT\_NOTIFY support.
Query sensor trip point notify with invalid event control. | Check INVALID\_PARAMETERS status is returned. | SENSOR\_TRIP\_POINT\_NOTIFY | -| test_m007 | Pre-Condition: SENSOR\_TRIP\_POINT\_NOTIFY support.
Query sensor trip point notify with invalid sensor id. | Check NOT\_FOUND status is returned. | SENSOR\_TRIP\_POINT\_NOTIFY | -| test_m008 | Pre-Condition: SENSOR\_TRIP\_POINT\_CONFIG support.
1. Query trip point config with incorrect reserve bits.
2. Query trip point config with invalid trip point id| Check INVALID\_PARAMETERS status is returned. | SENSOR\_TRIP\_POINT\_CONFIG | -| test_m009 | Pre-Condition: SENSOR\_TRIP\_POINT\_CONFIG support.
Query trip point config with invalid sensor id| Check NOT\_FOUND status is returned. | SENSOR\_TRIP\_POINT\_CONFIG | -| test_m010 | Pre-Condition: SENSOR\_TRIP\_POINT\_CONFIG support.
Query trip point config with valid parameters| Check SUCCESS status is returned. | SENSOR\_TRIP\_POINT\_CONFIG | -| test_m011 | Pass invalid flags value for sensor read. | Check INVALID\_PARAMETERS status is returned.| SENSOR\_READING\_GET | -| test_m012 | Read sensor data for invalid sensor id. | Check NOT\_FOUND status is returned. | SENSOR\_READING\_GET | -| test_m013 | Read sensor data in sync mode. | Check SUCCESS status is returned. | SENSOR\_READING\_GET | -| test_m014 | Pre-Condition: Sensor should support async read.
Read sensor data in async mode. | 1. Check SUCCESS status is returned.
2. Wait for delayed response | SENSOR\_READING\_GET | -| test_m015 | Read sensor data in async mode for unsupported sensors. | Check NOT\_SUPPORTED status is returned. | SENSOR\_READING\_GET | -| test_m016 | Discover the sensor axis properties. | Verify SUCCESS is returned and Check sensor axis data returned for supported sensor. | SENSOR\_AXIS\_DESCRIPTION\_GET | -| test_m017 | Discover sensor axis for non-existent sensor. | Verify NOT_FOUND is returned. | SENSOR\_AXIS\_DESCRIPTION\_GET | -| test_m018 | 1. Get update intervals supported by sensor.
2.Get invalid update interval array values for supported sensor. | 1. Verify SUCCESS is returned and interval data is sent.
2.Verify OUT_OF_INDEX is returned | SENSOR\_LIST\_UPDATE\_INTERVALS | -| test_m019 | Get update intervals for non-existent sensor. | Verify NOT_FOUND is returned. | SENSOR\_LIST\_UPDATE\_INTERVALS | -| test_m020 | Read sensor configuration information.| Verify SUCCESS is returned and read sensor configuration data. | SENSOR\_CONFIG\_GET | -| test_m021 | Read sensor configuration for non-existent sensor. | NOT\_FOUND is returned in response. | SENSOR\_CONFIG\_GET | -| test_m022 | Set up sensor configuration. | SUCCESS response is returned after applying configurations. | SENSOR\_CONFIG\_SET | -| test_m023 | Set up configurations for an invalid sensor. | NOT\_FOUND is returned in response. | SENSOR\_CONFIG\_SET | -| test_m024 | Set up sensor continous update notification request | SUCCESS response is returned after enabling notification. | SENSOR\_CONTINUOUS\_UPDATE\_NOTIFY | -| test_m025 | Set up continous update notification for invalid sensor. | NOT\_FOUND is returned in response. | SENSOR\_CONTINUOUS\_UPDATE\_NOTIFY | - -Reset Management Protocol Tests ---------- -This section outlines the test specification for SCMI Reset Management Protocol. - -| Test ID | Test Intent | Verification Step | Comments/Commands Used | -| ---------- | --------------------- | ------------------ | ----------------------- | -| test_r001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test_r002 | Query the protocol attributes. | Check num of reset domains against expected value. | PROTOCOL\_ATTRIBUTES | -| test_r003 | Query for mandatory command availability. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_r004 | 1. Send invalid command id for reset protocol.
2. Query the protocol message attributes with invalid msg_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test_r005 | Query reset domain attributes. | Check attributes values against expected values. | RESET\_DOMAIN\_ATTRIBUTES | -| test_r006 | Query reset domain attributes with invalid domain id. | Check NOT\_FOUND status is returned. | RESET\_DOMAIN\_ATTRIBUTES | -| test_r007 | Query reset protocol reset command with invalid domain id. | Check NOT\_FOUND status is returned. | RESET | -| test_r008 | 1. Query reset protocol reset command with invalid reserved bits.
2. Query reset protocol reset command with invalid flags. | 1. Check INVALID\_PARAMETERS status is returned.
2. Check NOT\_SUPPORTED status is returned. | RESET | -| test_r009 | Query reset protocol reset command with invalid reset_state. | Check INVALID\_PARAMETERS status is returned. | RESET | -| test_r010 | Pre-Condition: RESET\_PROTOCOL\_NOTIFY support.
Query reset protocol notify with invalid domain id. | Check NOT\_FOUND status is returned. | RESET\_PROTOCOL\_NOTIFY | -| test_r011 | Pre-Condition: RESET\_PROTOCOL\_NOTIFY support.
Query reset protocol notify with invalid notify enable. | Check INVALID\_PARAMETERS status is returned. | RESET\_PROTOCOL\_NOTIFY | - -Voltage Management Protocol Tests ---------- -This section outlines the test specification for SCMI Voltage Management Protocol. - -| Test ID | Test Intent | Verification Step | Comments/Commands Used | -| ---------- | --------------------- | ------------------ | ----------------------- | -| test\_v001 | Query the protocol version information. | Check Version against expected value. | PROTOCOL\_VERSION | -| test\_v002 | Query the protocol attributes. | Check num of voltage domains against expected value. | PROTOCOL\_ATTRIBUTES | -| test\_v003 | Query for mandatory command availability. | Check command implementation status. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test\_v004 | 1. Send invalid command id for voltage protocol.
2. Query the protocol message attributes with invalid msg\_id. | Check NOT\_FOUND status is returned. | PROTOCOL\_MESSAGE\_ATTRIBUTES | -| test\_v005 | Query Voltage domain attributes. | Check attributes values against expected values. | VOLTAGE\_DOMAIN\_ATTRIBUTES | -| test\_v006 | Query voltage domain attributes with invalid domain id. | Check NOT\_FOUND status is returned. | VOLTAGE\_DOMAIN\_ATTRIBUTES | -| test\_v007 | 1. Query Voltage describe level for valid domains and valid index.
2.Query Voltage describe level for valid domains but invalid index | 1. Check SUCCESS status is returned.
2. Check OUT\_OF\_RANGE status is returned. | VOLTAGE\_DESCRIBE\_LEVELS | -| test\_v008 | Query Voltage describe levels for non valid voltage domain IDs. | Check NOT\_FOUND status is returned. | VOLTAGE\_DESCRIBE\_LEVELS | -| test\_v009 | 1. Set Architectural Operating mode of voltage domains
2. Set IMPLEMENTATION defined Operating mode of voltage domains | 1. Check SUCCESS status is returned
2. Check SUCCESS status is returned | VOLTAGE\_CONFIG\_SET | -| test\_v010 | Set operating mode for invalid voltage domain | Check NOT\_FOUND status is returned | VOLTAGE\_CONFIG\_SET | -| test\_v011 | 1. Get Operating mode for valid voltage domain
2. Get operating mode for invalid voltage domain | 1. Check SUCCESS status returned
2. Check NOT\_FOUND status returned | VOLTAGE\_CONFIG\_GET | -| test\_v012 | Set Voltage level of valid voltage domain | Check SUCCESS status is returned | VOLTAGE\_LEVEL\_SET | -| test\_v013 | Set Voltage level of an invalid voltage domain | Check NOT\_FOUND status is returned | VOLTAGE\_LEVEL\_SET | -| test\_v014 | 1. Set Invalid voltage level to voltage domain
2. Set voltage with invalid flag | 1. Check INVALID\_PARAMETERS status is returned
2. Check INVALID\_PARAMETERS status is returned| VOLTAGE\_LEVEL\_SET | -| test\_v015 | 1. Get Voltage level for valid domain
2. Get Voltage level for invalid domain | 1. Check SUCCESS is returned
2. Check NOT\_FOUND is returned | VOLTAGE\_LEVEL\_GET | -- - - - - - - - - - - - - - - - - - - - - -_Copyright (c) 2021, Arm Limited and Contributors. All rights reserved._ diff --git a/docs/user_guide.md b/docs/user_guide.md deleted file mode 100644 index a8c5456538ff8f34021226089141b75d60a72337..0000000000000000000000000000000000000000 --- a/docs/user_guide.md +++ /dev/null @@ -1,252 +0,0 @@ - -**SCMI Compliance Suite User Guide** -============================== - -Table of Contents: - -- [Introduction](#introduction) -- [Prerequisites](#prerequisites) - * [Host machine requirements and tools](#host-machine-requirements-and-tools) -- [Getting SCMI test suite source code](#getting-scmi-test-suite-source-code) -- [Complaince suite design and library of tests](#test-suite-design-and-library-of-tests) -- [Build steps](#build-steps) - * [1. Build the test suite as a library](#building-the-test-suite-as-a-library) - * [2. Build the test suite as a test agent](#building-the-test-suite-as-a-test-agent) -- [Test suite execution](#test-suite-execution) - * [Running the test agent on host machine](#running-the-test-agent-on-host-machine) - * [Running as OSPM test agent ](#running-as-ospm-test-agent ) - * [Running in Baremetal environment](#running-in-baremetal-environment) -- [Test execution report](#test-execution-report) - -Introduction -------- - -This document outlines how to fetch, adapt, and build the SCMI test suite. The steps to build and run the test suite for a mocker platform on host machine, OSPM agent on Linux platform [System Guidance] and as baremetal library. - -## Prerequisites -The following are the prerequisites to build the SCMI test suite. - -### Host machine requirements and tools -------- - -The software is built on Ubuntu 16.04 LTS (64-bit). -Packages used for building the software are installed from this distribution unless specified. Though it is tested only on Ubuntu 16.04, it is expected to also work on later versions of Ubuntu. - -Install the following tools with the command: - ->`sudo apt-get install build-essential gcc make git` - -Download and install the AArch64 little-endian GCC cross compiler as specified in [Linaro Release]. - -Downloading the SCMI test suite source code -------- - -To download the SCMI test suite source code from GitHub, execute: - ->`git clone https://github.com/ARM-software/scmi-tests` - -Compliance suite design and library of tests -------- - -For details on the SCMI compliance suite design, see [Validation Methodology Document]. The design document provides an overview of the design considerations, the interfaces that must be implemented to adapt this test suite for your own platform, and the overall code organization. Some control flows are also detailed to describe the execution flow. - -For details on the tests that are included in the test suite, see [Test checklist]. - -Build steps -------- - -The compliance suite can be built as a library which can be linked to your execution environment or as an Operating System Power Management (OSPM) agent running on Linux. -The tests are designed for SCMI version 2.0, but backward compatibility is maintained with version 1.0. Test suit will internally check the version and do the tests accordingly. - -### 1. Building the test suite as a library - -To start the build, perform the following steps from the ``. - ->`CROSS_COMPILE=/aarch64-linux-gnu- make clean` -> ->`CROSS_COMPILE=/aarch64-linux-gnu- make PROTOCOLS= VERBOSE=` - -Example: - ->`CROSS_COMPILE=/aarch64-linux-gnu- make clean` -> ->`CROSS_COMPILE=/aarch64-linux-gnu- make PROTOCOLS=base,clock,power_domain,system_power,performance,sensor,reset VERBOSE=1` - -If you do not specify the PROTOCOLS variable when invoking the make command, Base Protocol test library alone is generated by default. - -The output of this make command is the libscmi_test.a library that includes the tests for all the specified protocols and version . The library will be generated in the ``. The arguments passed to the PROTOCOLS parameter are the subfolder names that are found in `/test_pool` folder. -If there are memory constraints on the platform, fewer tests can be included by modifying the PROTOCOLS variable. The library can be linked to your execution environment. - -### 2. Building the test suite as a test agent -A test agent is an execution wrapper for libscmi_test.a. Currently, support is provided for the following two platforms. - -#### 2.1 Mocker platform - -A self-test framework is implemented on a mocker platform that provides a simulated response to the SCMI commands issued by the test suite. To start the build, perform the following steps from the ``. - ->`make clean` -> ->`make PLAT=mocker PROTOCOLS=base,clock,performance,power_domain,system_power,sensor,reset VERBOSE=1` - -The output will be libscmi_test.a and scmi_test_agent in the ``. -When the test library is extended to support new protocols or commands, it is **not** necessary to support the same in the mocker platform, unless it is warranted for testing the framework changes. - -#### 2.2 OSPM agent - -In addition to building the library, the build also enables the SCMI test suite to run as an OSPM agent running from Linux using publicly available mailbox test driver interface. Reference implementation for SGM776 and TC are provided in the suite. User can add target name like TARGET=sgm776 or TARGET=tc as per the choice. To start the build, perform the following steps from the ``. - ->`CROSS_COMPILE=/aarch64-linux-gnu- make clean` -> ->`CROSS_COMPILE=/aarch64-linux-gnu- make PLAT=linux TARGET=tc PROTOCOLS=base,clock,power_domain,performance,system_power,sensor,reset VERBOSE=1` - -The output will be libscmi_test.a and scmi_test_agent for the Linux platform in the ``. - -The scmi_test_agent app supports the command-line option '-r' to optionally enable relaxed protocol versioning checks: when enabled the relevant testcases are run even if the SCMI Server under test advertised to implement a greater protocol version (i.e. newer) than the one officially supported by the current test-suite for that test-case and, in such a case, the protocol version mismatch is logged. -This behaviour could possibly lead to false positives if the newer protocol version specification introduced some non-backward compatible change: for this reason the relaxed checks are off by default andhave to be explicitly enabled using the '-r' switch. - -Instead of using the mailbox test driver, alternatively, the SCMI test suite can be build to make use of the Kernel SCMI Raw access interface by specifying TRANS=raw on the make commandline: - ->`make PLAT=linux TRANS=raw TARGET=sgm776 PROTOCOLS=base,clock,power_domain,performance,system_power,sensor,reset VERBOSE=1` - -**NOTE**: -* In both cases you must rebuild the Linux kernel (and the device tree in the mailbox test driver case) for LINUX by following the [Guide to test SCMI on LINUX]. - -##### 2.2.1 OSPM Agent Generic SCMI target support - EXPERIMENTAL -Additionally, it is possible to alternatively built the SCMI test suite to run against a generic SCMI implementation specifying TARGET=generic_scmi as in: - -make PLAT=linux TARGET=generic_scmi PROTOCOLS=base,clock,power_domain,performance,system_power,sensor,reset,voltage VERBOSE=1 - -Such generic target relaxes its expectations about number and name of agents, resources and protocols expected to be found on the system: in other words it tries to test whatever protocol and resource it could find during the initial BASE discovery phase without enforcing any specific assumption like with SGM/TX targets. - -#### 2.3 Baremetal - -The SCMI test suite can be complied as libscmi_test.a and integrated with your baremetal test framework. Please refer to [Validation Methodology Document] for PAL API's which needs to be ported for baremetal. - ->`CROSS_COMPILE=/aarch64-linux-gnu- make clean` -> ->`CROSS_COMPILE=/aarch64-linux-gnu- make PLAT=baremetal PROTOCOLS=base,clock,power_domain,performance,system_power,sensor,reset VERBOSE=1` -> -The output will be libscmi_test.a for baremetal platform and available in the ``. - -Test suite execution -------- - -### Running the test agent on the host machine - -To run the test suite on the host machine, execute the command: - ->`./scmi_test_agent` - -For the self_test/mocker platform, the test logs are dumped on the console itself. - -### Running as OSPM test agent - -To run the test suite on the Linux platform, execute the following command in the filesystem that is mounted on SGM/TC: - ->`cd ` -> ->`./scmi_test_agent` - -The test logs are captured in a report file arm\_scmi\_test\_log.txt in the same directory as the executable. - -#### OSPM test agent command-line options - -A few command-line option can be provided when running the test suite in the Linux platform. - ->`Usage: ./scmi_test_agent [-r][-p ]` - -where: -``` - -r: relax protocol version checking. Tests will be run even if the supported SCMI protocol version, - as advertised by the platform, is newer than the version supported by the testcase. - -p : provide a different SCMI debugfs root path. Default is: /sys/kernel/debug/scmi/0/ -``` -### Running in Baremetal environment - -To run the test suite on the baremetal environment, invoke to `arm_scmi_agent_execute()` from test framework. For more details, refer to [Validation Methodology Document]. - -Test execution report -------- - -The test report lists results per test case. The tests are organized as a collection within individual protocol. For every test case, the following verification steps occur: - -`Message Header`: The message header that is received from the platform is checked against what is in the send command. - -`Status`: The platform returns a status for a command that is issued by the agent and this is checked as per specification or as per the expected values provided by you. - -`Return Values - if relevant`: The remaining return values for a command response are valid based on the status return value. Checks are performed only if the status return value returned SUCCESS and expected values were given by the user. - -Each individual check delivers a PASS, FAIL, or SKIPPED. - -* Sample report with minimum verbosity (VERBOSE=1) - - 101: Base protocol version check - VERSION : 0x00020000 : CONFORMANT - 102: Base protocol attributes check : CONFORMANT - 103: Base msg attributes mandatory cmd check : CONFORMANT - 104: Base msg attributes invalid msg id check : CONFORMANT - 105: Base query vendor name check : CONFORMANT - 106: Base query subvendor name check : CONFORMANT - 107: Base query implementation version check : CONFORMANT - - -* Sample report with maximum verbosity (VERBOSE=5) - - 101: Base protocol version check - [Check 1] Query protocol version - MSG HDR : 0x00004000 - NUM PARAM : 0 - CHECK STATUS : PASSED [SCMI_STATUS_SUCCES] - CHECK HEADER : PASSED [0x00004000] - RETURN COUNT : 1 - RETURN[00] : 0x00020000 - VERSION : 0x00020000 : CONFORMANT - 102: Base protocol attributes check - [Check 1] Query protocol attributes - MSG HDR : 0x00004001 - NUM PARAM : 0 - CHECK STATUS : PASSED [SCMI_STATUS_SUCCES] - CHECK HEADER : PASSED [0x00004001] - RETURN COUNT : 1 - RETURN[00] : 0x00000206 - CHECK RSVD BITS: PASSED - CHECK NUM AGENTS: PASSED [0x00000002] - CHECK NUM PROTOCOLS: PASSED [0x00000006] : CONFORMANT - 103: Base msg attributes mandatory cmd check - [Check 1] BASE DISCOVER VENDOR support - MSG HDR : 0x00004002 - NUM PARAM : 1 - PARAMETER[00] : 0x00000003 - CHECK STATUS : PASSED [SCMI_STATUS_SUCCES] - CHECK HEADER : PASSED [0x00004002] - RETURN COUNT : 1 - RETURN[00] : 0x00000000 - CHECK RSVD BITS: PASSED - [Check 2] BASE DISCOVER IMPL VERSION support - MSG HDR : 0x00004002 - NUM PARAM : 1 - PARAMETER[00] : 0x00000005 - CHECK STATUS : PASSED [SCMI_STATUS_SUCCES] - CHECK HEADER : PASSED [0x00004002] - RETURN COUNT : 1 - RETURN[00] : 0x00000000 - CHECK RSVD BITS: PASSED - [Check 3] BASE DISCOVER LIST PROTOCOLS support - MSG HDR : 0x00004002 - NUM PARAM : 1 - PARAMETER[00] : 0x00000006 - CHECK STATUS : PASSED [SCMI_STATUS_SUCCES] - CHECK HEADER : PASSED [0x00004002] - RETURN COUNT : 1 - RETURN[00] : 0x00000000 - CHECK RSVD BITS: PASSED : CONFORMANT - -- - - - - - - - - - - - - - - - - - -_Copyright (c) 2019-2023, Arm Limited and Contributors. All rights reserved._ - -[Linaro Release]: https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/ -[Validation Methodology Document]: ./Arm_SCMI_Validation_Methodology.pdf "SCMI Test Suite Design" -[Test checklist]: ./scmi_testlist.md "SCMI Test Specification" -[System Guidance]: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms -[Guide to test SCMI on Linux]: ./guide_linux_testing.md diff --git a/linux_app/app.c b/linux_app/app.c index b367850520ff88fcd665d614b0c8bbbeeebbd1c9..a95e3fb5d31aa814ae6271c19f308a8dd7a505bd 100644 --- a/linux_app/app.c +++ b/linux_app/app.c @@ -98,6 +98,16 @@ int main(int argc, char *argv[]) val_voltage_execute_tests(); #endif +#ifdef POWERCAP_PROTOCOL + val_print(VAL_PRINT_ERR, "\n\n *** Starting POWERCAP tests *** "); + val_powercap_execute_tests(); +#endif + +#ifdef PIN_CONTROL_PROTOCOL + val_print(VAL_PRINT_ERR, "\n\n *** Starting PIN CONTROL tests *** "); + val_pin_control_execute_tests(); +#endif + num_pass = val_get_test_passed(); num_fail = val_get_test_failed(); num_skip = val_get_test_skipped(); diff --git a/mocker_app/app.c b/mocker_app/app.c index e6f71cf64374f0f8f27f881b865b536fa41aa607..48bb43cfe3194dc1566a98c252f08bd5f60b91a8 100644 --- a/mocker_app/app.c +++ b/mocker_app/app.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -78,6 +78,16 @@ int main(int argc, char *argv[]) val_voltage_execute_tests(); #endif +#ifdef POWERCAP_PROTOCOL + val_print(VAL_PRINT_ERR, "\n\n *** Starting POWERCAP tests *** "); + val_powercap_execute_tests(); +#endif + +#ifdef PIN_CONTROL_PROTOCOL + val_print(VAL_PRINT_ERR, "\n\n *** Starting PIN CONTROL tests *** "); + val_pin_control_execute_tests(); +#endif + num_pass = val_get_test_passed(); num_fail = val_get_test_failed(); num_skip = val_get_test_skipped(); diff --git a/platform/baremetal/include/pal_performance_expected.h b/platform/baremetal/include/pal_performance_expected.h index 7e73661d0578a6ea17905412b40b4d6302649832..5c42e0e0caf92e1996a2c05222a7ec13f2fc876b 100644 --- a/platform/baremetal/include/pal_performance_expected.h +++ b/platform/baremetal/include/pal_performance_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2017-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2017-2020, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -44,7 +44,8 @@ struct arm_scmi_performance_expected { PERFORMANCE_LEVEL_POWER_COST, PERFORMANCE_LEVEL_WORST_LATENCY, PERFORMANCE_LIMIT_NOTIFICATION_SUPPORTED, - PERFORMANCE_LEVEL_NOTIFICATION_SUPPORTED + PERFORMANCE_LEVEL_NOTIFICATION_SUPPORTED, + PERFORMANCE_LEVEL_INDEXING_MODE_SUPPORT } FLAGS; /* The expectation is that there is no more than 32 elements specified via * this expected results data structure. This mask is used to indicate @@ -80,6 +81,9 @@ struct arm_scmi_performance_expected { * change notifications on the given performance domain in this platform * bounded by the num_performance_domains variable*/ uint8_t *performance_level_notification_support; + /*This specifies if the level indexing mode is used by platform + *bounded by the number of domains */ + uint8_t *performance_domain_level_index_mode_support; /*This should have the list of performance rate limits in the platform * bounded by the num_performance_domains variable*/ uint32_t *performance_rate_limit; @@ -104,6 +108,9 @@ struct arm_scmi_performance_expected { /*This should have worst case latency info for each performance level in * this platform bounded by the num_performance_levels variable*/ uint32_t **performance_level_worst_latency; + /* This should have clock frequency in kHZ, of the performance domain when + * operating at this performance level */ + uint32_t **performance_level_indicative_frequency; /*This specifies if the performance level notification is expected to be * supported in the platform*/ uint8_t performance_limit_notification_supported; diff --git a/platform/baremetal/include/pal_pin_control_expected.h b/platform/baremetal/include/pal_pin_control_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..5e033e697ebb1837102057ce187b847a147023b6 --- /dev/null +++ b/platform/baremetal/include/pal_pin_control_expected.h @@ -0,0 +1,75 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#ifndef __PAL_PIN_CONTROL_EXPECTED_H__ +#define __PAL_PIN_CONTROL_EXPECTED_H__ + +#include + +#define NONE 0 + +struct arm_scmi_pin_control_expected { + /* + * This enum is to specify the flag_mask and have to be ensured that + * it is in the same order as the below structure elements after + * flags_mask member. + */ + enum { + PIN_CONTROL_PROTOCOL_VERSION, + PIN_CONTROL_NUMBER_GROUPS, + PIN_CONTROL_NUMBER_PINS, + PIN_CONTROL_NUMBER_FUNCTIONS, + PIN_CONTROL_NUMBER_PINS_IN_GROUP, + PIN_CONTROL_NUMBER_GROUPS_IN_FUNCTIONS, + PIN_CONTROL_PIN_NAME, + PIN_CONTROL_GROUP_NAME, + PIN_CONTROL_FUNCTION_NAME, + PIN_CONTROL_GROUP_ASSOCIATIONS, + PIN_CONTROL_FUNCTION_ASSOCIATIONS + } FLAGS; + /* + * The expectation is that there is no more + * than 32 elements specified via this expected results data structure. + * This mask is used to indicate which of the structure members hold valid + * data. + */ + uint32_t flags_mask; + uint32_t protocol_version; + + /* number of pin groups */ + uint32_t number_groups; + /* number of pins */ + uint32_t number_pins; + /* number of functions */ + uint32_t number_functions; + + /* number of pins in the group*/ + uint16_t *number_pins_in_group; + /* number of groups associated with the function*/ + uint16_t *number_groups_in_function; + /* + * This should have the extended name associated with a pin, group, or function in this + * platform bounded by the number of identifiers. + */ + char **pin_name; + char **group_name; + char **function_name; + /* Array of group or pin identifiers*/ + uint32_t **group_associations; + uint32_t **function_associations; +}; + +#endif /* __PAL_PIN_CONTROL_EXPECTED_H__ */ diff --git a/platform/baremetal/include/pal_powercap_expected.h b/platform/baremetal/include/pal_powercap_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..36a307aa9d725c33daef593d2fda072feadc24bc --- /dev/null +++ b/platform/baremetal/include/pal_powercap_expected.h @@ -0,0 +1,53 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_POWERCAP_EXPECTED_H__ +#define __PAL_POWERCAP_EXPECTED_H__ + +struct arm_scmi_powercap_expected { + /* + * This enum is to specify the flag_mask and have to be ensured that + * it is in the same order as the below structure elements after + * flags_mask member. + */ + enum { + POWERCAP_DOMAIN_PROTOCOL_VERSION = 1, + POWERCAP_NUMBER_DOMAINS, + POWERCAP_DOMAIN_NAME + } FLAGS; + /* + * The expectation is that there is no more + * than 32 elements specified via this expected results data structure. + * This mask is used to indicate which of the structure members hold valid + * data. + */ + uint32_t flags_mask; + uint32_t protocol_version; + + uint32_t number_domains; + + int32_t powercap_level; + + int32_t invalid_powercap_level; + /* + * This should have the names of the domains in this platform bounded by the + * number of domains descriptors. + */ + char **powercap_domain_name; +}; + +#endif /* __PAL_POWERCAP_EXPECTED_H__ */ diff --git a/platform/baremetal/pal_pin_control.c b/platform/baremetal/pal_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..21635a4d0828bb52550dcbf85a05cd2a09c82fb6 --- /dev/null +++ b/platform/baremetal/pal_pin_control.c @@ -0,0 +1,123 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifdef PIN_CONTROL_PROTOCOL + +#include "pal_interface.h" +#include "pal_pin_control_expected.h" + +extern void pal_pin_control_set_expected(const void *); +static struct arm_scmi_pin_control_expected *g_pin_control_info; + +/** + @brief Sets pin control protocol info + @param platform pin control protocol info + @return none +**/ +void pal_pin_control_set_expected(const void *info) +{ + if (info == NULL) + return; + g_pin_control_info = (struct arm_scmi_pin_control_expected *)info; +} + +/*----------- Common PAL API's across platforms ----------*/ + +/** + @brief This API is used for checking num of pins + @param none + @return num of pins +**/ +uint32_t pal_pin_control_get_expected_num_pins(void) +{ + return g_pin_control_info->number_pins; +} + +/** + @brief This API is used for checking num of groups + @param none + @return num of groups +**/ +uint32_t pal_pin_control_get_expected_num_groups(void) +{ + return g_pin_control_info->number_groups; +} + +/** + @brief This API is used for checking num of functions + @param none + @return num of functions +**/ +uint32_t pal_pin_control_get_expected_num_functions(void) +{ + return g_pin_control_info->number_functions; +} + +/** + @brief This API is used for checking num of pins a group + @param identifier of the pin + @return num of pins in a group +**/ +uint32_t pal_pin_control_get_expected_pins_in_group(uint32_t identifier) +{ + return g_pin_control_info->number_pins_in_group[identifier]; +} + +/** + @brief This API is used for checking num of groups associated with a function + @param identifier of the function + @return num of groups in a function +**/ +uint32_t pal_pin_control_get_expected_groups_in_func(uint32_t identifier) +{ + return g_pin_control_info->number_groups_in_function[identifier]; +} + +/** + @brief This API is used to get identifier of pin associated with the group + @param identifier of the group + @return pin identifier of group in index +**/ +uint32_t pal_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index) +{ + return g_pin_control_info->group_associations[identifier][index]; +} + +/** + @brief This API is used to get identifier of group associated with the function + @param identifier of the function + @return pin identifier of function in index +**/ +uint32_t pal_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index) +{ + return g_pin_control_info->function_associations[identifier][index]; +} + +/** +@brief This API is used to check if pin or group is accessible for given agent id + 1. Caller - Test Suite. + @param agent_id agent id + @param identifier The identifier of pin or group + @param selector Selector of pin or group + @return status 0 on access +**/ +uint32_t pal_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) + +{ + return NONE; +} +#endif diff --git a/platform/baremetal/pal_platform.c b/platform/baremetal/pal_platform.c index e28f103e745d0e8c144a0a1b90b82af610a2db60..673544394badcc4f38f436bf43530a9fbbd1437a 100644 --- a/platform/baremetal/pal_platform.c +++ b/platform/baremetal/pal_platform.c @@ -40,6 +40,12 @@ extern void pal_reset_set_expected(const void *); #ifdef VOLTAGE_PROTOCOL extern void pal_voltage_set_expected(const void *); #endif +#ifdef POWERCAP_PROTOCOL +extern void pal_powercap_set_expected(const void *); +#endif +#ifdef PIN_CONTROL_PROTOCOL +extern void pal_pin_control_set_expected(const void *); +#endif /** @brief This API is used to map a physical memory area to a virtual one. @@ -192,6 +198,16 @@ uint32_t pal_initialize_system(void *info) case 0x17: pal_voltage_set_expected(protocol_info->expected_return_values); break; +#endif +#ifdef POWERCAP_PROTOCOL + case 0x18: + pal_powercap_set_expected(protocol_info->expected_return_values); + break; +#endif +#ifdef PIN_CONTROL_PROTOCOL + case 0x19: + pal_pin_control_set_expected(protocol_info->expected_return_values); + break; #endif } protocol_info++; index++; diff --git a/platform/baremetal/pal_powercap.c b/platform/baremetal/pal_powercap.c new file mode 100644 index 0000000000000000000000000000000000000000..21224f840a9ed636adbfce75eb031ef6b73f249d --- /dev/null +++ b/platform/baremetal/pal_powercap.c @@ -0,0 +1,68 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifdef POWERCAP_PROTOCOL + +#include "pal_interface.h" +#include "pal_powercap_expected.h" + +extern void pal_powercap_set_expected(const void *); +static struct arm_scmi_powercap_expected *g_powercap_info; + + +/** + @brief Sets powercap domain protocol info + @param platform powercap domain protocol info + @return none +**/ +void pal_powercap_set_expected(const void *info) +{ + if (info == NULL) + return; + + g_powercap_info = (struct arm_scmi_powercap_expected *)info; +} + +/*----------- Common PAL API's across platforms ----------*/ + +/** + @brief This API is used for checking num of powercap domain + @param none + @return num of powercap domain +**/ +uint32_t pal_powercap_get_expected_num_domains(void) +{ + if (g_powercap_info == NULL) + return 0; + + return g_powercap_info->number_domains; +} + +/** + @brief This API is used for checking powercap domain name + @param domain id + @return powercap domain name +**/ +uint8_t *pal_powercap_get_expected_name(uint32_t domain_id) +{ + if (g_powercap_info == NULL) + return NULL; + + return (uint8_t *)g_powercap_info->powercap_domain_name[domain_id]; +} + +#endif diff --git a/platform/linux/common/Makefile b/platform/linux/common/Makefile index 531b6cf420a6da74fc1cb99867c7ba4b2de869f2..9c52d255a36f8590275c8b14856dc9bb20283957 100644 --- a/platform/linux/common/Makefile +++ b/platform/linux/common/Makefile @@ -1,5 +1,5 @@ #/** @file -# * Copyright (c) 2021-2023 Arm Limited or its affiliates. All rights reserved. +# * Copyright (c) 2021-2023, Arm Limited or its affiliates. All rights reserved. # * SPDX-License-Identifier : Apache-2.0 # * # * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/linux/common/transport_mailbox.c b/platform/linux/common/transport_mailbox.c index 8ade155afc1577d53589f34b3f1ef404e8aaa395..711e83f1b31f60160ae7c8efa65b288666eafa7e 100644 --- a/platform/linux/common/transport_mailbox.c +++ b/platform/linux/common/transport_mailbox.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -400,4 +400,10 @@ uint32_t linux_device_get_accessible_protocol(uint32_t device_id) return NO_ERROR; } - +/*! + * @brief Interface function that checks if the given pin or group is accessible for given agent + */ +uint32_t linux_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) +{ + return NO_ERROR; +} diff --git a/platform/linux/common/transport_raw.c b/platform/linux/common/transport_raw.c index 24f4ea631d9706a6a3dedff99cf4ea8db5754eec..bc53344e061594de57a29184a35b61edc97b8c4a 100644 --- a/platform/linux/common/transport_raw.c +++ b/platform/linux/common/transport_raw.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -232,22 +232,20 @@ static int32_t __linux_send_message(uint32_t message_header_send, size_t paramet count = read(fd_message, buffer, rawc->max_msg_size); if (count < 0) { close(fd_message); - return ERROR;\ + return ERROR; } /* read the payload part */ for (counter = 0; counter < count / 4; ++counter) { if (counter == 0) { - // extract header + /* extract header */ *message_header_rcv = *((uint32_t *)buffer + counter); - } - else if (counter == 1) { - // extract status + } else if (counter == 1) { + /* extract status */ *status = *((uint32_t *)buffer + counter); - } - else { - // extract payload - // return_values starts from 0, hence subtract 2 here + } else { + /* extract payload */ + /* return_values starts from 0, hence subtract 2 here */ return_values[(counter - 2)] = *((uint32_t *)buffer + counter); (*return_values_count)++; } @@ -327,16 +325,14 @@ int linux_wait_for_response(uint32_t *message_header_rcv, /* read the payload part */ for (counter = 0; counter < count / 4; ++counter) { if (counter == 0) { - // extract header + /* extract header */ *message_header_rcv = *((uint32_t *)buffer + counter); - } - else if (counter == 1) { - // extract status + } else if (counter == 1) { + /* extract status */ *status = *((uint32_t *)buffer + counter); - } - else { - // extract payload - // return_values starts from 0, hence subtract 2 here + } else { + /* extract payload */ + /* return_values starts from 0, hence subtract 2 here */ return_values[(counter - 2)] = *((uint32_t *)buffer + counter); (*return_values_count)++; } @@ -388,12 +384,11 @@ int linux_wait_for_notification(uint32_t *message_header_rcv, /* read the payload part */ for (counter = 0; counter < count / 4; ++counter) { if (counter == 0) { - // extract header - // plus 1 to skip the Length + /* extract header */ + /* plus 1 to skip the Length */ *message_header_rcv = *((uint32_t *)buffer + counter); - } - else { - // extract payload + } else { + /* extract payload */ return_values[(counter - 1)] = *((uint32_t *)buffer + counter); (*return_values_count)++; } @@ -428,4 +423,10 @@ uint32_t linux_device_get_accessible_protocol(uint32_t device_id) return NO_ERROR; } - +/*! + * @brief Interface function that checks if the given pin or group is accessible for given agent + */ +uint32_t linux_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) +{ + return NO_ERROR; +} diff --git a/platform/linux/generic_scmi/include/pal_pin_control_expected.h b/platform/linux/generic_scmi/include/pal_pin_control_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..19c1d4e5ac515968e409d137311b4215531f90b4 --- /dev/null +++ b/platform/linux/generic_scmi/include/pal_pin_control_expected.h @@ -0,0 +1,24 @@ +/** @file + * Copyright (c) 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#ifndef __PAL_PIN_CONTROL_EXPECTED_H__ +#define __PAL_PIN_CONTROL_EXPECTED_H__ + +#include + +#define NONE 0 + +#endif /* __PAL_PIN_CONTROL_EXPECTED_H__ */ diff --git a/platform/linux/generic_scmi/include/pal_platform.h b/platform/linux/generic_scmi/include/pal_platform.h index 2f977c46d35c4828c8c3d5c51ff8a371f3c15777..476046c223bf872bf8b226f6740b49269083805a 100644 --- a/platform/linux/generic_scmi/include/pal_platform.h +++ b/platform/linux/generic_scmi/include/pal_platform.h @@ -53,5 +53,6 @@ int linux_wait_for_response(uint32_t *message_header_rcv, uint32_t linux_agent_get_accessible_device(uint32_t agent_id); uint32_t linux_agent_get_inaccessible_device(uint32_t agent_id); uint32_t linux_device_get_accessible_protocol(uint32_t device_id); +uint32_t linux_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector); #endif diff --git a/platform/linux/generic_scmi/pal_clock.c b/platform/linux/generic_scmi/pal_clock.c index 04b0f06b3fbc833b6457f0d7545996263e09c823..133fa4205170abd8cd2ddd7d5531dd09844dc6c6 100644 --- a/platform/linux/generic_scmi/pal_clock.c +++ b/platform/linux/generic_scmi/pal_clock.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/linux/generic_scmi/pal_performance.c b/platform/linux/generic_scmi/pal_performance.c index 229a7e3f6259b6dde81966e5a7d06d0e3ca4adcf..8bb7e63949739a2dd222baa81681d81be2678b48 100644 --- a/platform/linux/generic_scmi/pal_performance.c +++ b/platform/linux/generic_scmi/pal_performance.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/linux/generic_scmi/pal_pin_control.c b/platform/linux/generic_scmi/pal_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..80ea4394e091559480bd645c494042520537e544 --- /dev/null +++ b/platform/linux/generic_scmi/pal_pin_control.c @@ -0,0 +1,106 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#ifdef PIN_CONTROL_PROTOCOL + +#include +#include +/*----------- Common POWER API's across platforms ----------*/ + +/** + @brief This API is used for checking num of pins + @param none + @return num of pins +**/ +uint32_t pal_pin_control_get_expected_num_pins(void) +{ + return PAL_SCMI_ANYTHING; +} + +/** + @brief This API is used for checking num of groups + @param none + @return num of groups +**/ +uint32_t pal_pin_control_get_expected_num_groups(void) +{ + return PAL_SCMI_ANYTHING; +} + +/** + @brief This API is used for checking num of functions + @param none + @return num of functions +**/ +uint32_t pal_pin_control_get_expected_num_functions(void) +{ + return PAL_SCMI_ANYTHING; +} + +/** + @brief This API is used for checking num of pins in a group + @param identifier of the pin + @return num of pins in a group +**/ +uint32_t pal_pin_control_get_expected_pins_in_group(uint32_t identifier) +{ + return PAL_SCMI_ANYTHING; +} + +/** + @brief This API is used for checking num of groups associated with the function + @param identifier of the function + @return num of groups in function +**/ +uint32_t pal_pin_control_get_expected_groups_in_func(uint32_t identifier) +{ + return PAL_SCMI_ANYTHING; +} + +/** + @brief This API is used to get identifier of pin associated with the group + @param identifier of the group + @return pin identifier of group in index +**/ +uint32_t pal_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index) +{ + return PAL_SCMI_ANYTHING; +} + +/** + @brief This API is used to get identifier of group associated with the function + @param identifier of the function + @return pin identifier of function in index +**/ +uint32_t pal_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index) +{ + return PAL_SCMI_ANYTHING; +} + +/** +@brief This API is used to check if pin or group is accessible for given agent id + 1. Caller - Test Suite. + @param agent_id agent id + @param identifier The identifier of pin or group + @param selector Selector of pin or group + @return status 0 on access +**/ +uint32_t pal_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) + +{ + return linux_pinctrl_check_access(agent_id, identifier, selector); +} +#endif diff --git a/platform/linux/generic_scmi/pal_platform.c b/platform/linux/generic_scmi/pal_platform.c index c2b8712114ef37ca2641e62ebe9d149e922b987b..c62f7d0123533099853c206245ed65be625ee6c3 100644 --- a/platform/linux/generic_scmi/pal_platform.c +++ b/platform/linux/generic_scmi/pal_platform.c @@ -100,12 +100,12 @@ uint32_t pal_initialize_system(void *info) void pal_print(uint32_t print_level, const char *format, va_list args) { FILE *file_ptr = fopen(LOG_FILE, "a"); + if (file_ptr) { vfprintf(file_ptr, format, args); fclose(file_ptr); - } - else + } else printf("ERROR: Log File opening failed"); } diff --git a/platform/linux/generic_scmi/pal_power_domain.c b/platform/linux/generic_scmi/pal_power_domain.c index c5ec0a8d525b600567de3ad04bd980c7f7afcd7a..0184482ca8b6c4a7278fc7adec6c9ead6f845dc9 100644 --- a/platform/linux/generic_scmi/pal_power_domain.c +++ b/platform/linux/generic_scmi/pal_power_domain.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/linux/generic_scmi/pal_powercap.c b/platform/linux/generic_scmi/pal_powercap.c new file mode 100644 index 0000000000000000000000000000000000000000..fdf5b3797fbc832d3ab6603b8de18089b041388c --- /dev/null +++ b/platform/linux/generic_scmi/pal_powercap.c @@ -0,0 +1,42 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifdef POWERCAP_PROTOCOL + +#include "pal_interface.h" + +/** + @brief This API is used for checking num of powercap domain + @param none + @return num of powercap domain +**/ +uint32_t pal_powercap_get_expected_num_domains(void) +{ + return PAL_SCMI_ANYTHING; +} + +/** + @brief This API is used for checking powercap domain name + @param domain id + @return powercap domain name +**/ +uint8_t *pal_powercap_get_expected_name(uint32_t domain_id) +{ + return PAL_SCMI_ANYNAME; +} + +#endif diff --git a/platform/linux/generic_scmi/pal_reset.c b/platform/linux/generic_scmi/pal_reset.c index ebf75822305701e77b77f46d2632bd8db0115507..068aeff95a49e99ec50071ae1de53172f0495483 100644 --- a/platform/linux/generic_scmi/pal_reset.c +++ b/platform/linux/generic_scmi/pal_reset.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/linux/generic_scmi/pal_sensor.c b/platform/linux/generic_scmi/pal_sensor.c index 1a61b0ab88ee3a1c19fdbec3ca46022cb2184ec1..44b5b42683072176dab9641b2572d1921cf75831 100644 --- a/platform/linux/generic_scmi/pal_sensor.c +++ b/platform/linux/generic_scmi/pal_sensor.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/linux/juno/include/pal_pin_control_expected.h b/platform/linux/juno/include/pal_pin_control_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..c18e62ccbbb9934d47fb3e6a8f8d33f27de9a131 --- /dev/null +++ b/platform/linux/juno/include/pal_pin_control_expected.h @@ -0,0 +1,52 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_PIN_CONTROL_EXPECTED_H__ +#define __PAL_PIN_CONTROL_EXPECTED_H__ + +#include + +#ifdef PIN_CONTROL_PROTOCOL +/* Expected PIN CONTROL parameters */ +static uint32_t num_groups = 2; +static uint32_t num_pins = 4; +static uint32_t num_functions = 2; + +static uint16_t num_pins_in_group[] = {1, 2}; +static uint16_t num_groups_in_function[] = {1, 1}; + +static uint32_t *group_associations[] = { + (uint32_t[]) { /* GROUP 0 */ + 1, + }, + (uint32_t[]) { /* GROUP 1 */ + 2, + 3, + }, +}; + +static uint32_t *function_associations[] = { + (uint32_t[]) { /* FUNCTION 0 */ + 1, + }, + (uint32_t[]) { /* FUNCTION 1 */ + 2, + }, +}; +#endif + +#endif /* __PAL_PIN_CONTROL_EXPECTED_H__ */ diff --git a/platform/linux/juno/include/pal_platform.h b/platform/linux/juno/include/pal_platform.h index 7241e8d3f267e423df5d4b64a37e9728e594ba2f..471d41768215517537cca7685134a1ed8e81cfb1 100644 --- a/platform/linux/juno/include/pal_platform.h +++ b/platform/linux/juno/include/pal_platform.h @@ -65,5 +65,6 @@ int linux_wait_for_response(uint32_t *message_header_rcv, uint32_t linux_agent_get_accessible_device(uint32_t agent_id); uint32_t linux_agent_get_inaccessible_device(uint32_t agent_id); uint32_t linux_device_get_accessible_protocol(uint32_t device_id); +uint32_t linux_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector); #endif diff --git a/platform/linux/juno/pal_pin_control.c b/platform/linux/juno/pal_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..56c79d67fdcb12b7ddcab9f0ea72dd9d9ae308c5 --- /dev/null +++ b/platform/linux/juno/pal_pin_control.c @@ -0,0 +1,107 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#ifdef PIN_CONTROL_PROTOCOL + +#include +#include + +/*----------- Common POWER API's across platforms ----------*/ + +/** + @brief This API is used for checking num of pins + @param none + @return num of pins +**/ +uint32_t pal_pin_control_get_expected_num_pins(void) +{ + return num_pins; +} + +/** + @brief This API is used for checking num of groups + @param none + @return num of groups +**/ +uint32_t pal_pin_control_get_expected_num_groups(void) +{ + return num_groups; +} + +/** + @brief This API is used for checking num of functions + @param none + @return num of functions +**/ +uint32_t pal_pin_control_get_expected_num_functions(void) +{ + return num_functions; +} + +/** + @brief This API is used for checking num of pins in a group + @param identifier of the pin + @return num of pins in a group +**/ +uint32_t pal_pin_control_get_expected_pins_in_group(uint32_t identifier) +{ + return num_pins_in_group[identifier]; +} + +/** + @brief This API is used for checking num of groups associated with the function + @param identifier of the function + @return num of groups in function +**/ +uint32_t pal_pin_control_get_expected_groups_in_func(uint32_t identifier) +{ + return num_groups_in_function[identifier]; +} + +/** + @brief This API is used to get identifier of pin associated with the group + @param identifier of the group + @return pin identifier of group in index +**/ +uint32_t pal_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index) +{ + return group_associations[identifier][index]; +} + +/** + @brief This API is used to get identifier of group associated with the function + @param identifier of the function + @return pin identifier of function in index +**/ +uint32_t pal_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index) +{ + return function_associations[identifier][index]; +} + +/** +@brief This API is used to check if pin or group is accessible for given agent id + 1. Caller - Test Suite. + @param agent_id agent id + @param identifier The identifier of pin or group + @param selector Selector of pin or group + @return status 0 on access +**/ +uint32_t pal_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) + +{ + return linux_pinctrl_check_access(agent_id, identifier, selector); +} +#endif diff --git a/platform/linux/sgm776/include/pal_pin_control_expected.h b/platform/linux/sgm776/include/pal_pin_control_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..91602a5d56a14d19c8e3c26e7abed10344f80870 --- /dev/null +++ b/platform/linux/sgm776/include/pal_pin_control_expected.h @@ -0,0 +1,52 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_PIN_CONTROL_EXPECTED_H__ +#define __PAL_PIN_CONTROL_EXPECTED_H__ + +#include + +#ifdef PIN_CONTROL_PROTOCOL +/* Expected PIN CONTROL parameters */ +static uint32_t num_groups = 1; +static uint32_t num_pins = 2; +static uint32_t num_functions = 1; + +static uint16_t num_pins_in_group[] = {1, 2}; +static uint16_t num_groups_in_function[] = {1, 1}; + +static uint32_t *group_associations[] = { + (uint32_t[]) { /* GROUP 0 */ + 1, + }, + (uint32_t[]) { /* GROUP 1 */ + 2, + 3, + }, +}; + +static uint32_t *function_associations[] = { + (uint32_t[]) { /* FUNCTION 0 */ + 1, + }, + (uint32_t[]) { /* FUNCTION 1 */ + 2, + }, +}; +#endif + +#endif /* __PAL_PIN_CONTROL_EXPECTED_H__ */ diff --git a/platform/linux/sgm776/include/pal_platform.h b/platform/linux/sgm776/include/pal_platform.h index 002a71b02ec3954b584e04c0de951b41fcde33f1..971dafc7403088cb6bbddef5212cac26a8a35e28 100644 --- a/platform/linux/sgm776/include/pal_platform.h +++ b/platform/linux/sgm776/include/pal_platform.h @@ -35,6 +35,7 @@ #define SENSOR_PROTOCOL_ID 0x15 #define RESET_PROTOCOL_ID 0x16 #define VOLTAGE_PROTOCOL_ID 0x17 +#define POWERCAP_PROTOCOL_ID 0x18 #define APCORE_PROTOCOL_ID 0x09 @@ -67,5 +68,5 @@ int linux_wait_for_response(uint32_t *message_header_rcv, uint32_t linux_agent_get_accessible_device(uint32_t agent_id); uint32_t linux_agent_get_inaccessible_device(uint32_t agent_id); uint32_t linux_device_get_accessible_protocol(uint32_t device_id); - +uint32_t linux_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector); #endif diff --git a/platform/linux/sgm776/include/pal_powercap_expected.h b/platform/linux/sgm776/include/pal_powercap_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..3c59a2a5e464b7ebb6af383ff0fe36b566080210 --- /dev/null +++ b/platform/linux/sgm776/include/pal_powercap_expected.h @@ -0,0 +1,30 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_POWERCAP_EXPECTED_H__ +#define __PAL_POWERCAP_EXPECTED_H__ + +#ifdef POWERCAP_PROTOCOL + +uint32_t num_powercap_domains = 0x01; + +static char *powercap_domain_name[] = { + "USB", +}; +#endif + +#endif /* __PAL_POWERCAP_EXPECTED_H__ */ diff --git a/platform/linux/sgm776/pal_pin_control.c b/platform/linux/sgm776/pal_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..56c79d67fdcb12b7ddcab9f0ea72dd9d9ae308c5 --- /dev/null +++ b/platform/linux/sgm776/pal_pin_control.c @@ -0,0 +1,107 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#ifdef PIN_CONTROL_PROTOCOL + +#include +#include + +/*----------- Common POWER API's across platforms ----------*/ + +/** + @brief This API is used for checking num of pins + @param none + @return num of pins +**/ +uint32_t pal_pin_control_get_expected_num_pins(void) +{ + return num_pins; +} + +/** + @brief This API is used for checking num of groups + @param none + @return num of groups +**/ +uint32_t pal_pin_control_get_expected_num_groups(void) +{ + return num_groups; +} + +/** + @brief This API is used for checking num of functions + @param none + @return num of functions +**/ +uint32_t pal_pin_control_get_expected_num_functions(void) +{ + return num_functions; +} + +/** + @brief This API is used for checking num of pins in a group + @param identifier of the pin + @return num of pins in a group +**/ +uint32_t pal_pin_control_get_expected_pins_in_group(uint32_t identifier) +{ + return num_pins_in_group[identifier]; +} + +/** + @brief This API is used for checking num of groups associated with the function + @param identifier of the function + @return num of groups in function +**/ +uint32_t pal_pin_control_get_expected_groups_in_func(uint32_t identifier) +{ + return num_groups_in_function[identifier]; +} + +/** + @brief This API is used to get identifier of pin associated with the group + @param identifier of the group + @return pin identifier of group in index +**/ +uint32_t pal_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index) +{ + return group_associations[identifier][index]; +} + +/** + @brief This API is used to get identifier of group associated with the function + @param identifier of the function + @return pin identifier of function in index +**/ +uint32_t pal_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index) +{ + return function_associations[identifier][index]; +} + +/** +@brief This API is used to check if pin or group is accessible for given agent id + 1. Caller - Test Suite. + @param agent_id agent id + @param identifier The identifier of pin or group + @param selector Selector of pin or group + @return status 0 on access +**/ +uint32_t pal_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) + +{ + return linux_pinctrl_check_access(agent_id, identifier, selector); +} +#endif diff --git a/platform/linux/sgm776/pal_powercap.c b/platform/linux/sgm776/pal_powercap.c new file mode 100644 index 0000000000000000000000000000000000000000..034ce0962983789b239b0ea784f44927e929614b --- /dev/null +++ b/platform/linux/sgm776/pal_powercap.c @@ -0,0 +1,43 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifdef POWERCAP_PROTOCOL + +#include "pal_interface.h" +#include "pal_powercap_expected.h" + +/** + @brief This API is used for checking num of powercap domain + @param none + @return num of powercap domain +**/ +uint32_t pal_powercap_get_expected_num_domains(void) +{ + return num_powercap_domains; +} + +/** + @brief This API is used for checking powercap domain name + @param domain id + @return powercap domain name +**/ +uint8_t *pal_powercap_get_expected_name(uint32_t domain_id) +{ + return (uint8_t *)powercap_domain_name[domain_id]; +} + +#endif diff --git a/platform/linux/tc/include/pal_base_expected.h b/platform/linux/tc/include/pal_base_expected.h index e8563046e0d4f1170af7e02a3af78285afcf5c8c..b39b5cd07cc3b908178a3bf2a7779e67ea67139f 100644 --- a/platform/linux/tc/include/pal_base_expected.h +++ b/platform/linux/tc/include/pal_base_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,8 +26,7 @@ static uint32_t supported_protocols[] = { BASE_PROTOCOL_ID, PWR_DOMAIN_PROTOCOL_ID, PERFORMANCE_PROTOCOL_ID, - CLOCK_PROTOCOL_ID, - VOLTAGE_PROTOCOL + CLOCK_PROTOCOL_ID }; static char *agents[] = { @@ -38,6 +37,6 @@ static char *agents[] = { static char *vendor_name = "arm"; static char *subvendor_name = "arm"; -static uint32_t implementation_version = VERSION_ENCODE32(2, 9, 0); +static uint32_t implementation_version = VERSION_ENCODE32(2, 12, 0); #endif /* __PAL_BASE_EXPECTED_H__ */ diff --git a/platform/linux/tc/include/pal_clock_expected.h b/platform/linux/tc/include/pal_clock_expected.h index e677aa7792d7bc6cd6cecca23ae4836e18261d1a..628412721873435b621743659f99b530357e3fc9 100644 --- a/platform/linux/tc/include/pal_clock_expected.h +++ b/platform/linux/tc/include/pal_clock_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,9 +25,9 @@ static uint32_t num_clocks = 0x03; static uint32_t num_of_clock_rates[] = { - 0x1, /* DPU */ - 0x1, /* PIXEL_0 */ - 0x1 /* PIXEL_1 */ + 0x3, /* DPU */ + 0x3, /* PIXEL_0 */ + 0x3 /* PIXEL_1 */ }; uint32_t max_num_pending_async_rate_chg_supported = 0; diff --git a/platform/linux/tc/include/pal_performance_expected.h b/platform/linux/tc/include/pal_performance_expected.h index 93cbf919dab751cbc43d2fe8bda0207a5d63ffb7..d1ac5fadfd3bae180f3e2af4c9f5b13bdf708940 100644 --- a/platform/linux/tc/include/pal_performance_expected.h +++ b/platform/linux/tc/include/pal_performance_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,18 +20,20 @@ /* Expected PERFORMANCE parameters */ #ifdef PERFORMANCE_PROTOCOL -static uint32_t num_perf_domains = 0x03; +static uint32_t num_perf_domains = 0x04; static uint32_t perf_num_performance_levels[] = { - 5, /* KLEIN */ - 5, /* MATTERHORN */ - 5 /* MATTERHORN_ELP */ + 5, /* CPU_GROUP_CORTEX_A520 */ + 5, /* CPU_GROUP_CORTEX_A720 */ + 5, /* CPU_GROUP_CORTEX_X4 */ + 4 /* GPU */ }; static char *performance_domain_names[] = { - "CPU_GROUP_KLEIN", - "CPU_GROUP_MATTERHORN", - "CPU_GROUP_MATTERHORN_ELP" + "CPU_GROUP_CORTEX_A520", + "CPU_GROUP_CORTEX_A720", + "CPU_GROUP_CORTEX_X4", + "GPU" }; uint32_t statistics_address_low_perf = 0; diff --git a/platform/linux/tc/include/pal_pin_control_expected.h b/platform/linux/tc/include/pal_pin_control_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..91602a5d56a14d19c8e3c26e7abed10344f80870 --- /dev/null +++ b/platform/linux/tc/include/pal_pin_control_expected.h @@ -0,0 +1,52 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_PIN_CONTROL_EXPECTED_H__ +#define __PAL_PIN_CONTROL_EXPECTED_H__ + +#include + +#ifdef PIN_CONTROL_PROTOCOL +/* Expected PIN CONTROL parameters */ +static uint32_t num_groups = 1; +static uint32_t num_pins = 2; +static uint32_t num_functions = 1; + +static uint16_t num_pins_in_group[] = {1, 2}; +static uint16_t num_groups_in_function[] = {1, 1}; + +static uint32_t *group_associations[] = { + (uint32_t[]) { /* GROUP 0 */ + 1, + }, + (uint32_t[]) { /* GROUP 1 */ + 2, + 3, + }, +}; + +static uint32_t *function_associations[] = { + (uint32_t[]) { /* FUNCTION 0 */ + 1, + }, + (uint32_t[]) { /* FUNCTION 1 */ + 2, + }, +}; +#endif + +#endif /* __PAL_PIN_CONTROL_EXPECTED_H__ */ diff --git a/platform/linux/tc/include/pal_platform.h b/platform/linux/tc/include/pal_platform.h index 777c1e6d5be02b411a8850af5ba72b5af764ac07..40f571cfec2827d8a96f16203905f9e0cacea445 100644 --- a/platform/linux/tc/include/pal_platform.h +++ b/platform/linux/tc/include/pal_platform.h @@ -34,6 +34,9 @@ #define CLOCK_PROTOCOL_ID 0x14 #define SENSOR_PROTOCOL_ID 0x15 #define RESET_PROTOCOL_ID 0x16 +#define VOLTAGE_PROTOCOL_ID 0x17 +#define POWERCAP_PROTOCOL_ID 0x18 + #define APCORE_PROTOCOL_ID 0x09 #define TIMEOUT 100 @@ -65,5 +68,5 @@ int linux_wait_for_response(uint32_t *message_header_rcv, uint32_t linux_agent_get_accessible_device(uint32_t agent_id); uint32_t linux_agent_get_inaccessible_device(uint32_t agent_id); uint32_t linux_device_get_accessible_protocol(uint32_t device_id); - +uint32_t linux_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector); #endif diff --git a/platform/linux/tc/include/pal_power_domain_expected.h b/platform/linux/tc/include/pal_power_domain_expected.h index 0a16171d29e3db324128ee0fab1af4ec52f71cbf..4e10f94d2974e0bc8a2e9123bb92e4fd394b9cfe 100644 --- a/platform/linux/tc/include/pal_power_domain_expected.h +++ b/platform/linux/tc/include/pal_power_domain_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,7 +20,7 @@ /* Expected POWER DOMAIN parameters */ #ifdef POWER_DOMAIN_PROTOCOL -static uint32_t num_power_domains = 0x09; +static uint32_t num_power_domains = 0x0b; uint32_t statistics_address_low_pow = 0; uint32_t statistics_address_len_pow = 0; diff --git a/platform/linux/tc/include/pal_powercap_expected.h b/platform/linux/tc/include/pal_powercap_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..a5b64f35956f5a37ee81c5b3ccdc919e8bc3a6f9 --- /dev/null +++ b/platform/linux/tc/include/pal_powercap_expected.h @@ -0,0 +1,30 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_POWERCAP_EXPECTED_H__ +#define __PAL_POWERCAP_EXPECTED_H__ + +#ifdef POWERCAP_PROTOCOL + +uint32_t num_powercap_domains = 0x01; + +static char *powercap_domain_name[] = { + "DUMMY", +}; +#endif + +#endif /* __PAL_POWERCAP_EXPECTED_H__ */ diff --git a/platform/linux/tc/pal_pin_control.c b/platform/linux/tc/pal_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..56c79d67fdcb12b7ddcab9f0ea72dd9d9ae308c5 --- /dev/null +++ b/platform/linux/tc/pal_pin_control.c @@ -0,0 +1,107 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#ifdef PIN_CONTROL_PROTOCOL + +#include +#include + +/*----------- Common POWER API's across platforms ----------*/ + +/** + @brief This API is used for checking num of pins + @param none + @return num of pins +**/ +uint32_t pal_pin_control_get_expected_num_pins(void) +{ + return num_pins; +} + +/** + @brief This API is used for checking num of groups + @param none + @return num of groups +**/ +uint32_t pal_pin_control_get_expected_num_groups(void) +{ + return num_groups; +} + +/** + @brief This API is used for checking num of functions + @param none + @return num of functions +**/ +uint32_t pal_pin_control_get_expected_num_functions(void) +{ + return num_functions; +} + +/** + @brief This API is used for checking num of pins in a group + @param identifier of the pin + @return num of pins in a group +**/ +uint32_t pal_pin_control_get_expected_pins_in_group(uint32_t identifier) +{ + return num_pins_in_group[identifier]; +} + +/** + @brief This API is used for checking num of groups associated with the function + @param identifier of the function + @return num of groups in function +**/ +uint32_t pal_pin_control_get_expected_groups_in_func(uint32_t identifier) +{ + return num_groups_in_function[identifier]; +} + +/** + @brief This API is used to get identifier of pin associated with the group + @param identifier of the group + @return pin identifier of group in index +**/ +uint32_t pal_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index) +{ + return group_associations[identifier][index]; +} + +/** + @brief This API is used to get identifier of group associated with the function + @param identifier of the function + @return pin identifier of function in index +**/ +uint32_t pal_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index) +{ + return function_associations[identifier][index]; +} + +/** +@brief This API is used to check if pin or group is accessible for given agent id + 1. Caller - Test Suite. + @param agent_id agent id + @param identifier The identifier of pin or group + @param selector Selector of pin or group + @return status 0 on access +**/ +uint32_t pal_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) + +{ + return linux_pinctrl_check_access(agent_id, identifier, selector); +} +#endif diff --git a/platform/linux/tc/pal_powercap.c b/platform/linux/tc/pal_powercap.c new file mode 100644 index 0000000000000000000000000000000000000000..034ce0962983789b239b0ea784f44927e929614b --- /dev/null +++ b/platform/linux/tc/pal_powercap.c @@ -0,0 +1,43 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifdef POWERCAP_PROTOCOL + +#include "pal_interface.h" +#include "pal_powercap_expected.h" + +/** + @brief This API is used for checking num of powercap domain + @param none + @return num of powercap domain +**/ +uint32_t pal_powercap_get_expected_num_domains(void) +{ + return num_powercap_domains; +} + +/** + @brief This API is used for checking powercap domain name + @param domain id + @return powercap domain name +**/ +uint8_t *pal_powercap_get_expected_name(uint32_t domain_id) +{ + return (uint8_t *)powercap_domain_name[domain_id]; +} + +#endif diff --git a/platform/mocker/include/pal_base_expected.h b/platform/mocker/include/pal_base_expected.h index 8a39cbe13ba847e93c842cfe184e3e150aa5d08f..617939a203c1bb7b79934068e35c22556919e1ed 100644 --- a/platform/mocker/include/pal_base_expected.h +++ b/platform/mocker/include/pal_base_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,6 +28,8 @@ static uint8_t supported_protocols[] = { SENSOR_PROTOCOL_ID, RESET_PROTOCOL_ID, VOLTAGE_PROTOCOL_ID, + POWERCAP_PROTOCOL_ID, + PIN_CONTROL_PROTOCOL_ID }; /* Expected BASE parameters */ diff --git a/platform/mocker/include/pal_clock_expected.h b/platform/mocker/include/pal_clock_expected.h index 3308564b4677180e5ef9f2d5c551da37ff405a7c..9a9022af59c9d239786a59e579911736f0f2b2cd 100644 --- a/platform/mocker/include/pal_clock_expected.h +++ b/platform/mocker/include/pal_clock_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,4 +29,6 @@ static uint32_t num_of_clock_rates[] = { static uint32_t num_clocks = sizeof(num_of_clock_rates) / sizeof(num_of_clock_rates[0]); +static uint32_t clock_parent_support[] = {0, 1, 1}; + #endif /* PAL_TARGET_H_ */ diff --git a/platform/mocker/include/pal_performance_expected.h b/platform/mocker/include/pal_performance_expected.h index 5509e5e306982de20fe3705ec8f4662166bbab88..078e3e74c8c32521fbcfbbf822e1bf64c28c8c51 100644 --- a/platform/mocker/include/pal_performance_expected.h +++ b/platform/mocker/include/pal_performance_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,13 +25,20 @@ static uint32_t num_performance_domains = PERF_EXPECTED_NUM_OF_DOMAIN; static uint32_t statistics_address_low_perf = 0x1234; static uint32_t statistics_address_len_perf = 0xFF; -static uint8_t set_limit_capable[] = {1, 1, 1 ,0}; -static uint8_t set_performance_level_capable[] = {1, 1, 1 ,0}; +static uint8_t set_limit_capable[] = {1, 1, 1, 0}; +static uint8_t set_performance_level_capable[] = {1, 1, 1, 0}; static uint8_t performance_level_notification_support[] = {0, 0, 0 ,0}; static uint8_t performance_limit_notification_support[] = {0, 0, 0 ,0}; static uint32_t performance_rate_limit[] = {10, 20, 30 ,40}; static uint32_t performance_sustained_freq[] = {100, 200, 300 ,400}; static uint32_t performance_sustained_level[] = {110, 120, 130 ,140}; +static uint8_t performance_domain_level_index_mode_support[] = { + 0, /* Domain 0 */ + 0, /* Domain 1 */ + 0, /* Domain 2 */ + 0, /* Domain 3 */ +}; + static char* performance_domain_names[] = { "Domain_0", @@ -134,6 +141,34 @@ static uint32_t * perf_performance_level_worst_latency[] = { }, }; +static uint32_t *perf_performance_level_indicative_frequency[] = { + (uint32_t[]) { + 1000, + 2000, + 3000, + }, + (uint32_t[]) { + 4000, + 5000, + 6000, + 7000, + }, + (uint32_t[]) { + 8000, + 9000, + 10000, + 11000, + 12000, + }, + (uint32_t[]) { + 13000, + 14000, + 15000, + 16000, + 17000, + 18000, + }, +}; static uint8_t perf_msg_fast_ch_support[] = { 0, /* Version*/ 0, /* Protocol attr*/ diff --git a/platform/mocker/include/pal_pin_control_expected.h b/platform/mocker/include/pal_pin_control_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..d670ba9b9aefc2f8cdb1381ac798d33e4eea1efc --- /dev/null +++ b/platform/mocker/include/pal_pin_control_expected.h @@ -0,0 +1,56 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_PIN_CONTROL_EXPECTED_H__ +#define __PAL_PIN_CONTROL_EXPECTED_H__ + +#include + +/* Expected PIN CONTROL parameters */ +static uint32_t num_groups = 2; +static uint32_t num_pins = 4; +static uint32_t num_functions = 2; + +static uint16_t num_pins_in_group[] = {1, 2}; +static uint16_t num_groups_in_function[] = {1, 1}; + +static uint32_t *group_associations[] = { + (uint32_t[]) { /* GROUP 0 */ + 1, + }, + (uint32_t[]) { /* GROUP 1 */ + 2, + 3, + }, +}; + +static uint32_t *function_associations[] = { + (uint32_t[]) { /* FUNCTION 0 */ + 1, + }, + (uint32_t[]) { /* FUNCTION 1 */ + 2, + }, +}; + +static uint32_t *pin_control_extended_name_support[] = { + (uint32_t []) {1, 0, 0, 1}, /* Pin Extended Name support */ + (uint32_t []) {0, 1}, /* Group Extended Name support */ + (uint32_t []) {1, 0} /* Function Extended Name support */ +}; + +#endif /* __PAL_PIN_CONTROL_EXPECTED_H__ */ diff --git a/platform/mocker/include/pal_platform.h b/platform/mocker/include/pal_platform.h index 2ac10f1ebc6a54dddbee0a7ec47f297b8770793b..8fe8807ad38aa4a35cedcace35b8055c2f9981c7 100644 --- a/platform/mocker/include/pal_platform.h +++ b/platform/mocker/include/pal_platform.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -30,6 +30,8 @@ #define SENSOR_PROTOCOL_ID 0x15 #define RESET_PROTOCOL_ID 0x16 #define VOLTAGE_PROTOCOL_ID 0x17 +#define POWERCAP_PROTOCOL_ID 0x18 +#define PIN_CONTROL_PROTOCOL_ID 0x19 enum BITS_HEADER { RESERVED_LOW = 28, @@ -56,6 +58,7 @@ uint32_t agent_get_accessible_device(uint32_t agent_id); uint32_t agent_get_inaccessible_device(uint32_t agent_id); uint32_t device_get_accessible_protocol(uint32_t device_id); uint32_t check_trusted_agent(uint32_t agent_id); +uint32_t pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector); void base_send_message(uint32_t message_id, uint32_t parameter_count, const uint32_t *parameters, int32_t *status, @@ -89,6 +92,13 @@ void voltage_send_message(uint32_t message_id, uint32_t parameter_count, const uint32_t *parameters, int32_t *status, size_t *return_values_count, uint32_t *return_values); +void powercap_send_message(uint32_t message_id, uint32_t parameter_count, + const uint32_t *parameters, int32_t *status, + size_t *return_values_count, uint32_t *return_values); + +void pin_control_send_message(uint32_t message_id, uint32_t parameter_count, + const uint32_t *parameters, int32_t *status, + size_t *return_values_count, uint32_t *return_values); void fill_base_protocol(void); void fill_power_protocol(void); @@ -97,5 +107,7 @@ void fill_sensor_protocol(void); void fill_performance_protocol(void); void fill_reset_protocol(void); void fill_voltage_protocol(void); +void fill_powercap_protocol(void); +void fill_pin_control_protocol(void); #endif /*__PAL_PLATFORM__*/ diff --git a/platform/mocker/include/pal_power_domain_expected.h b/platform/mocker/include/pal_power_domain_expected.h index c60cebe44e3bb17db944538eb44523ee44c47f5f..f7c1e41abf246d6f2b4eaff465b64f4b101099a5 100644 --- a/platform/mocker/include/pal_power_domain_expected.h +++ b/platform/mocker/include/pal_power_domain_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,5 +25,6 @@ static uint32_t num_power_domains = 3; static uint32_t statistics_address_low_pow = 0x1234; static uint32_t statistics_address_len_pow = 0xFF; - +static uint32_t power_synchronous_support[] ={1, 1, 0}; +static uint32_t power_asynchronous_support[] ={1, 1, 0}; #endif /* __PAL_POWER_DOMAIN_EXPECTED_H__ */ diff --git a/platform/mocker/include/pal_powercap_expected.h b/platform/mocker/include/pal_powercap_expected.h new file mode 100644 index 0000000000000000000000000000000000000000..06966539ab13bb66a8222f5057c4b474de18a6a8 --- /dev/null +++ b/platform/mocker/include/pal_powercap_expected.h @@ -0,0 +1,43 @@ +/** @file + * Copyright (c) 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_POWERCAP_EXPECTED_H__ +#define __PAL_POWERCAP_EXPECTED_H__ + + +static uint32_t num_powercap_domain = 0x02; + +static char *powercap_domain_name[] = { + "EXT_POWERCAP_EXTENDED_GPU", "CPU" +}; + +static uint32_t min_pai[] = {100, 150}; +static uint32_t max_pai[] = {300, 350}; +static uint32_t pai_step[] = {4, 5}; +static uint32_t min_power_cap[] = {120, 110}; +static uint32_t max_power_cap[] = {300, 340}; +static uint32_t power_cap_step[] = {10, 8}; +static uint32_t sustainable_power[] = {150, 200}; +static uint32_t accuracy[] = {50, 50}; +static uint32_t pai[] = {130, 180}; +static uint32_t power_cap[] = {150, 200}; +static uint32_t avg_power[] = {200, 400}; +static uint32_t powercap_extended_name_support[] ={1, 0}; + + +#endif /* __PAL_POWERCAP_EXPECTED_H__ */ + diff --git a/platform/mocker/include/pal_voltage_expected.h b/platform/mocker/include/pal_voltage_expected.h index 63cc1a7d6c220cea3c24fb4113ebcb7bdbe42a7b..74b9c12eefe281f3acb7a788ded5f1c006a2f3e3 100644 --- a/platform/mocker/include/pal_voltage_expected.h +++ b/platform/mocker/include/pal_voltage_expected.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,10 +18,18 @@ #ifndef __PAL_VOLTAGE_EXPECTED_H__ #define __PAL_VOLTAGE_EXPECTED_H__ -static uint32_t num_voltage_domains = 0x01; +static uint32_t num_voltage_domains = 0x02; static char *voltage_domain_names[] = { "USB", + "EXT_ENHANCEMENT_VOLTAGE_1" }; +static uint32_t *voltage_describe_levels[] = { + (uint32_t[]) {15, 30, 40, 90}, /* Voltage Domain 0 */ + (uint32_t[]) {10, 40, 60, 110} /* Voltage Domain 1 */ +}; + +static uint32_t operational_level[] = {40, 60}; + #endif /* __PAL_VOLTAGE_EXPECTED_H__ */ diff --git a/platform/mocker/mocker/include/clock_common.h b/platform/mocker/mocker/include/clock_common.h index 98d74fa4b84a0622bbc311213e791d79f48ae866..24dbbe3bf83a5f66f73573e95c9a3e0f6604d895 100644 --- a/platform/mocker/mocker/include/clock_common.h +++ b/platform/mocker/mocker/include/clock_common.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2020, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,6 +20,8 @@ #include +#define SCMI_MAX_CLOCK_PARENTS 2 + struct arm_scmi_clock_protocol_version { struct { uint32_t version; @@ -57,6 +59,32 @@ struct arm_scmi_clock_attributes { } clk_attributes_bits; }; +struct arm_scmi_clock_attributes_v2 { + struct { + uint32_t clock_id; + } parameters; + struct { + uint32_t attributes; + uint8_t clock_name[SCMI_NAME_STR_SIZE]; + uint32_t clock_enable_delay; + } returns; + + enum { + CLK_ATTRIBUTES_ENABLE_LOW_V2 = 0, + CLK_ATTRIBUTES_ENABLE_HIGH_V2 = 0, + CLK_ATTRIBUTES_RESERVED_LOW_V2 = 1, + CLK_ATTRIBUTES_RESERVED_HIGH_V2 = 27, + CLK_ATTRIBUTES_PARENT_SUPPORT_LOW_V2 = 28, + CLK_ATTRIBUTES_PARAENT_SUPPORT_HIGH_V2 = 28, + CLK_ATTRIBUTES_EXT_NAME_SUPPORT_LOW_V2 = 29, + CLK_ATTRIBUTES_EXT_NAME_SUPPORT_HIGH_V2 = 29, + CLK_ATTRIBUTES_CHANGE_REQ_NOTIFY_LOW_V2 = 30, + CLK_ATTRIBUTES_CHANGE_REQ_NOTIFY_HIGH_V2 = 30, + CLK_ATTRIBUTES_CHANGE_NOTIFY_LOW_V2 = 31, + CLK_ATTRIBUTES_CHANGE_NOTIFY_HIGH_V2 =31 + } clk_attributes_bits_v2; +}; + struct arm_scmi_clock_protocol_message_attributes { struct { uint32_t message_id; @@ -128,4 +156,82 @@ struct arm_scmi_clock_config_set { } config_set_flags; }; +struct arm_scmi_clock_config_get { + struct { + uint32_t clock_id; + uint32_t flags; + } parameters; + struct { + uint32_t attributes; + uint32_t config; + uint32_t oem_config_val; + } returns; + /* enum for clock config get flag parameter */ + enum { + CLK_CONFIGGET_OEM_VALUE_LOW = 0, + CLK_CONFIGGET_OEM_VALUE_HIGH = 7, + CLK_CONFIGGET_RESERVED_LOW = 8, + CLK_CONFIGGET_RESERVED_HIGH =31 + } config_get_flags; + /* enum for clock config get config parameter */ + enum { + CLK_CONFIGGET_ATTR_ENABLED = 0, + CLK_CONFIGGET_ATTR_RESERVED_LOW = 1, + CLK_CONFIGGET_ATTR_RESERVED_HIGH = 31, + } config_get_config; + +}; + +struct arm_scmi_clock_parent_get { + struct { + uint32_t clock_id; + } parameters; + struct { + uint32_t parent_id; + } returns; +}; + +struct arm_scmi_clock_parent_set { + struct { + uint32_t clock_id; + uint32_t parent_id; + } parameters; +}; + +struct arm_scmi_clock_config_set_v4 { + struct { + uint32_t clock_id; + uint32_t attributes; + uint32_t oem_config_val; + } parameters; + enum { + CLK_CONFIGSET_ATTR_ENABLED_V4 = 0, + CLK_CONFIGSET_ATTR_RESERVED0_LOW_V4 = 2, + CLK_CONFIGSET_ATTR_RESERVED0_HIGH_V4 = 15, + CLK_CONFIGSET_ATTR_OEM_CONFIG_LOW_V4 = 16, + CLK_CONFIGSET_ATTR_OEM_CONFIG_HIGH_V4 = 23, + CLK_CONFIGSET_ATTR_RESERVED1_LOW_V4 = 24, + CLK_CONFIGSET_ATTR_RESERVED1_HIGH_V4 = 31, + } config_set_flags; +}; + +struct arm_scmi_clock_possible_parents_get { + struct { + uint32_t clock_id; + uint32_t skip_parents; + } parameters; + struct { + uint32_t flags; + uint32_t possible_parents[SCMI_MAX_CLOCK_PARENTS]; + } returns; + enum { + CLK_POSSIBLE_PARENTS_RETURNED_LOW = 0, + CLK_POSSIBLE_PARENTS_RETURNED_HIGH = 7, + CLK_POSSIBLE_PARENTS_RESERVED_LOW = 8, + CLK_POSSIBLE_PARENTS_RESERVED_HIGH = 23, + CLK_POSSIBLE_PARENTS_REMAINING_LOW = 24, + CLK_POSSIBLE_PARENTS_REMAINING_HIGH = 31 + } clock_possible_parents_flags_bits; +}; + #endif /* CLOCK_COMMON_H_ */ diff --git a/platform/mocker/mocker/include/clock_protocol.h b/platform/mocker/mocker/include/clock_protocol.h index a6426c0b5c254f26a1afcc4d195ebdfb9c04891e..35fd1c484717142555d629b99d7354375b21d8a2 100644 --- a/platform/mocker/mocker/include/clock_protocol.h +++ b/platform/mocker/mocker/include/clock_protocol.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,7 +21,11 @@ #include #include +#ifdef SCMI_VERSION_1 #define CLOCK_VERSION 0x00010000 +#else +#define CLOCK_VERSION 0x00020001 +#endif #define CLK_PROTO_ID 0x14 #define CLK_PROTO_VER_MSG_ID 0x0 @@ -32,6 +36,10 @@ #define CLK_RATE_SET_MSG_ID 0x5 #define CLK_RATE_GET_MSG_ID 0x6 #define CLK_CONFIG_SET_MSG_ID 0x7 +#define CLK_PARENT_GET_MSG_ID 0xE +#define CLK_PARENT_SET_MSG_ID 0xD +#define CLK_CONFIG_GET_MSG_ID 0xB +#define CLK_POSSIBLE_PARENT_GET_MSG_ID 0xC #define MAX_NUM_CLOCK 16 #define MAX_NUM_RATES_SUPPORTED 16 @@ -57,6 +65,11 @@ struct arm_scmi_clock_rate { uint32_t upper; }; +struct arm_scmi_clock_current_parent { + uint32_t clock_id; + uint32_t parent_id; +}; + struct arm_scmi_clock_protocol { /* * This enum is to specify the flag_mask and have to be ensured that @@ -71,7 +84,8 @@ struct arm_scmi_clock_protocol { THREE_TUPLE_CLOCK_RATES, DISCRETE_CLOCK_RATES, CLOCK_NUM_RATES, - CLOCK_NAMES + CLOCK_NAMES, + CLOCK_PARENT_SUPPORT } FLAGS; /* * The expectation is that there is no more @@ -130,6 +144,8 @@ struct arm_scmi_clock_protocol { */ const char **clock_name; + uint32_t *clock_parent_support; + }; #endif /* CLOCK_EXPECTED_H_ */ diff --git a/platform/mocker/mocker/include/performance_common.h b/platform/mocker/mocker/include/performance_common.h index 7fcaa9377fe705b32fc3362e0da8cb95bc4eae79..90dc2c753ebf3224b846ec2653dc1d1d19a863c7 100644 --- a/platform/mocker/mocker/include/performance_common.h +++ b/platform/mocker/mocker/include/performance_common.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -81,6 +81,32 @@ struct arm_scmi_performance_domain_attributes { PERFORMANCE_DOMAIN_ATTR_RATE_RESERVED_HIGH = 31 }arm_scmi_performance_domain_attributes_bits; }; +struct arm_scmi_performance_domain_attributes_v4 { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t attributes; + uint32_t rate_limit; + uint32_t sustained_freq; + uint32_t sustained_perf_level; + uint8_t name[SCMI_NAME_STR_SIZE]; + } returns; + enum { + PERFORMANCE_DOMAIN_ATTR_LIMIT_SET_V4 = 31, + PERFORMANCE_DOMAIN_ATTR_LEVEL_SET_V4 = 30, + PERFORMANCE_DOMAIN_ATTR_LIMIT_NOTIFY_V4 = 29, + PERFORMANCE_DOMAIN_ATTR_LEVEL_NOTIFY_V4 = 28, + PERFORMANCE_DOMAIN_ATTR_FASTCHANNEL_SUPPORT_V4 = 27, + PERFORMANCE_DOMAIN_LEVEL_INDEX_MODE_SUPPORT_V4 = 25, + PERFORMANCE_DOMAIN_ATTR_RESERVED_LOW_V4 = 0, + PERFORMANCE_DOMAIN_ATTR_RESERVED_HIGH_V4 = 24, + PERFORMANCE_DOMAIN_ATTR_RATE_LIMIT_LOW_V4 = 0, + PERFORMANCE_DOMAIN_ATTR_RATE_LIMIT_HIGH_V4 = 19, + PERFORMANCE_DOMAIN_ATTR_RATE_RESERVED_LOW_V4 = 20, + PERFORMANCE_DOMAIN_ATTR_RATE_RESERVED_HIGH_V4 = 31 + }arm_scmi_performance_domain_attributes_bits_v4; +}; struct arm_scmi_performance_describe_levels { struct { uint32_t domain_id; @@ -107,6 +133,34 @@ struct arm_scmi_performance_describe_levels { PERFORMANCE_DESC_LEVELS_ATTR_RESERVED_HIGH = 31 }arm_scmi_performance_describe_levels_bits; }; +struct arm_scmi_performance_describe_levels_v4 { + struct { + uint32_t domain_id; + uint32_t skip_index; + } parameters; + struct { + uint32_t num_levels; + struct arm_scmi_perf_levels_v4 { + uint32_t performance_level_value; + uint32_t power_cost; + uint32_t attributtes; + uint32_t indicative_frequency; + uint32_t level_index; + } perf_levels; + } returns; + enum { + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_REMAINING_LOW_V4 = 16, + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_REMAINING_HIGH_V4 = 31, + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_RESERVED_LOW_V4 = 12, + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_RESERVED_HIGH_V4 = 15, + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_LOW_V4 = 0, + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_HIGH_V4 = 11, + PERFORMANCE_DESC_LEVELS_ATTR_TRANSITION_LOW_V4 = 0, + PERFORMANCE_DESC_LEVELS_ATTR_TRANSITION_HIGH_V4 = 15, + PERFORMANCE_DESC_LEVELS_ATTR_RESERVED_LOW_V4 = 16, + PERFORMANCE_DESC_LEVELS_ATTR_RESERVED_HIGH_V4 = 31 + }arm_scmi_performance_describe_levels_bits_v4; +}; struct arm_scmi_performance_limits_set { struct { uint32_t domain_id; diff --git a/platform/mocker/mocker/include/performance_protocol.h b/platform/mocker/mocker/include/performance_protocol.h index eb8f8f1f38cb09ac2f239a9d43ddc5e0654335b1..424f9e2418b0b1edd2069fbc469d99dc321b258c 100644 --- a/platform/mocker/mocker/include/performance_protocol.h +++ b/platform/mocker/mocker/include/performance_protocol.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2020, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,7 @@ #ifdef SCMI_VERSION_1 #define PERFORMANCE_VERSION 0x00010000 #else -#define PERFORMANCE_VERSION 0x00020000 +#define PERFORMANCE_VERSION 0x00040000 #endif #define PERF_MGMT_PROTO_ID 0x13 @@ -68,8 +68,10 @@ struct arm_scmi_performance_protocol { PERFORMANCE_LEVEL_VALUE, PERFORMANCE_LEVEL_POWER_COST, PERFORMANCE_LEVEL_WORST_LATENCY, + PERFORMANCE_LEVEL_INDICATIVE_FREQUENCY, PERFORMANCE_LIMIT_NOTIFICATION_SUPPORTED, - PERFORMANCE_LEVEL_NOTIFICATION_SUPPORTED + PERFORMANCE_LEVEL_NOTIFICATION_SUPPORTED, + PERFORMANCE_LEVEL_INDEXING_MODE_SUPPORT } FLAGS; /* The expectation is that there is no more than 32 elements specified via * this expected results data structure. This mask is used to indicate @@ -117,6 +119,9 @@ struct arm_scmi_performance_protocol { /*This should have the list of performance domain names in the platform * bounded by the num_performance_domains variable*/ char **performance_domain_names; + /*This specifies if the level indexing mode is used by platform + *bounded by the number of domains */ + uint8_t *performance_domain_level_index_mode_support; /*This should have the list of performance levels in the platform * bounded by the num_performance_domains variable*/ uint32_t *num_performance_levels; @@ -129,6 +134,9 @@ struct arm_scmi_performance_protocol { /*This should have worst case latency info for each performance level in * this platform bounded by the num_performance_levels variable*/ uint32_t **performance_level_worst_latency; + /* This should have clock frequency in kHZ, of the performance domain when + * operating at this performance level */ + uint32_t **performance_level_indicative_frequency; /*This specifies if the performance level notification is expected to be * supported in the platform*/ uint8_t performance_limit_notification_supported; diff --git a/platform/mocker/mocker/include/pin_control_common.h b/platform/mocker/mocker/include/pin_control_common.h new file mode 100644 index 0000000000000000000000000000000000000000..319c09fb30be48cba7c7b25cbec66a1254981ace --- /dev/null +++ b/platform/mocker/mocker/include/pin_control_common.h @@ -0,0 +1,260 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef PIN_CONTROL_COMMON_H_ +#define PIN_CONTROL_COMMON_H_ + +#include + +#define PINCTRL_CONFIG_ENTRY 2 +#define SCMI_PIN_GROUP_ARRAY_SIZE 5 + +struct arm_scmi_pin_control_protocol_version { + struct { + uint32_t version; + } returns; +}; + +struct arm_scmi_pin_control_protocol_attributes { + struct { + uint32_t attributes_low; + uint32_t attributes_high; + } returns; + /* enums for attributes_low */ + enum { + PINCTRL_NUM_PINS_LOW = 0, + PINCTRL_NUM_PINS_HIGH = 15, + PINCTRL_NUM_PIN_GROUPS_LOW = 16, + PINCTRL_NUM_PIN_GROUPS_HIGH = 31 + } attributes_low_bits; + /* enums for attributes_high */ + enum { + PINCTRL_NUM_FUNCTIONS_LOW = 0, + PINCTRL_NUM_FUNCTIONS_HIGH = 15, + PINCTRL_NUM_RESERVED_LOW = 16, + PINCTRL_NUM_RESERVED_HIGH = 31 + } attributes_high_bits; +}; + +struct arm_scmi_pin_control_protocol_message_attributes { + struct { + uint32_t message_id; + } parameters; + struct { + uint32_t attributes; + } returns; +}; + +struct arm_scmi_pin_control_attributes { + struct { + uint32_t identifier; + uint32_t flags; + } parameters; + struct { + uint32_t attributes; + uint8_t name[SCMI_NAME_STR_SIZE]; + } returns; + /* enums for flags */ + enum { + PINCTRL_FLAGS_SELECTOR_LOW = 0, + PINCRTL_FLAGS_SELECTOR_HIGH = 1, + PINCTRL_FLAGS_RESERVED_LOW = 2, + PINCTRL_FLAGS_RESERVED_HIGH = 31 + } flags_bits; +/* enums for attributes */ + enum { + PINCTRL_ATTRIBUTES_NUM_PINS_GROUPS_LOW = 0, + PINCTRL_ATTRIBUTES_NUM_PINS_GROUPS_HIGH = 15, + PINCTRL_ATTRIBUTES_RESERVED_LOW = 16, + PINCTRL_ATTRIBUTES_RESERVED_HIGH = 30, + PINCTRL_ATTRIBUTES_EXTENDED_NAME_LOW = 31, + PINCTRL_ATTRIBUTES_EXTENDED_NAME_HIGH = 31 + } attributes; +}; + +struct arm_scmi_pin_control_list_associations { + struct { + uint32_t identifier; + uint32_t list_parameters_flags; + uint32_t index; + } parameters; + struct { + uint32_t list_returns_flags; + uint16_t array[SCMI_PIN_GROUP_ARRAY_SIZE]; + } returns; + /* enums for parameters flags */ + enum { + PINCTRL_LIST_PARAMS_FLAGS_SELECTOR_LOW = 0, + PINCTRL_LIST_PARAMS_FLAGS_SELECTOR_HIGH = 1, + PINCTRL_LIST_PARAMS_FLAGS_RESERVED_LOW = 2, + PINCTRL_LIST_PARAMS_FLAGS_RESERVED_HIGH = 31 + } list_parameters_flags_bits; + /* enums for returns flags */ + enum { + PINCTRL_LIST_RETURNS_FLAGS_NUM_IDENTIFIERS_LOW = 0, + PINCTRL_LIST_RETURNS_FLAGS_NUM_IDENTIFIERS_HIGH = 11, + PINCTRL_LIST_RETURNS_FLAGS_RESERVED_LOW = 12, + PINCTRL_LIST_RETURNS_FLAGS_RESERVED_HIGH = 15, + PINCTRL_LIST_RETURNS_FLAGS_NUM_REMAINING_LOW = 16, + PINCTRL_LIST_RETURNS_FLAGS_NUM_REMAINING_HIGH = 31 + } list_returns_flags_bits; +}; + +struct arm_scmi_pin_control_config_get { + struct { + uint32_t identifier; + uint32_t attributes; + } parameters; + struct { + uint32_t num_configs; + uint32_t configs[PINCTRL_CONFIG_ENTRY]; + } returns; + /* enum for attributes */ + enum { + PINCTRL_CONFIG_GET_CONFIGTYPE_LOW = 0, + PINCTRL_CONFIG_GET_CONFIGTYPE_HIGH = 7, + PINCTRL_CONFIG_GET_SKIPCONFIGS_LOW = 8, + PINCTRL_CONFIG_GET_SKIPCONFIGS_HIGH = 15, + PINCTRL_CONFIG_GET_SELECTOR_LOW = 16, + PINCTRL_CONFIG_GET_SELECTOR_HIGH = 17, + PINCTRL_CONFIG_GET_ALLCONFIGS_LOW = 18, + PINCTRL_CONFIG_GET_ALLCONFIGS_HIGH = 18, + PINCTRL_CONFIG_GET_RESERVED_LOW = 19, + PINCTRL_CONFIG_GET_RESERVED_HIGH = 31 + } attributes_bits; + /* enums for num_configs*/ + enum { + PINCTRL_CONFIG_GET_NUM_CONFIGS_LOW = 0, + PINCTRL_CONFIG_GET_NUM_CONFIGS_HIGH = 7, + PINCTRL_CONFIG_GET_NUM_CONFIGS_RESERVED_LOW = 8, + PINCTRL_CONFIG_GET_NUM_CONFIGS_RESERVED_HIGH = 23, + PINCTRL_CONFIG_GET_NUM_REMAINING_CONFIGS_LOW = 24, + PINCTRL_CONFIG_GET_NUM_REMAINING_CONFIGS_HIGH = 31 + } num_configs_bits; + /* enums for configs entry 0 */ + enum { + PINCTRL_CONFIG_GET_CONFIG_TYPE_LOW = 0, + PINCTRL_CONFIG_GET_CONFIG_TYPE_HIGH = 7, + PINCTRL_CONFIG_GET_ENTRY_RESERVED_LOW = 8, + PINCTRL_CONFIG_GET_ENTRY_RESERVED_HIGH = 31 + } get_configs_entry_0_bits; +}; + +struct arm_scmi_pin_control_config_set { + struct { + uint32_t identifier; + uint32_t attributes; + uint32_t configs[PINCTRL_CONFIG_ENTRY]; + } parameters; + /* enums for attributes */ + enum { + PINCTRL_CONFIG_SET_SELECTOR_LOW = 0, + PINCTRL_CONFIG_SET_SELECTOR_HIGH = 1, + PINCTRL_CONFIG_SET_NUM_CONFIGS_LOW = 2, + PINCTRL_CONFIG_SET_NUM_CONFIGS_HIGH = 9, + PINCTRL_CONFIG_SET_RESERVED_LOW = 10, + PINCTRL_CONFIG_SET_RESERVED_HIGH = 31 + } set_attributes_bits; + /* enums for configs entry 0 */ + enum { + PINCTRL_CONFIG_SET_CONFIG_TYPE_LOW = 0, + PINCTRL_CONFIG_SET_CONFIG_TYPE_HIGH = 7, + PINCTRL_CONFIG_SET_ENTRY_RESERVED_LOW = 8, + PINCTRL_CONFIG_SET_ENTRY_RESERVED_HIGH = 31 + } set_configs_entry_0_bits; +}; + +struct arm_scmi_pin_control_function_select { + struct { + uint32_t identifier; + uint32_t function_id; + uint32_t flags; + } parameters; + /* enums for flags */ + enum { + PINCTRL_FUNCTION_SELECT_SELECTOR_LOW = 0, + PINCTRL_FUNCTION_SELECT_SELECTOR_HIGH = 1, + PINCTRL_FUNCTION_SELECT_RESERVED_LOW = 2, + PINCTRL_FUNCTION_SELECT_RESERVED_HIGH = 31 + } function_select_flags_bits; +}; + +struct arm_scmi_pin_control_request { + struct { + uint32_t identifier; + uint32_t flags; + } parameters; + /* enums for flags */ + enum { + PINCTRL_REQUEST_SELECTOR_LOW = 0, + PINCTRL_REQUEST_SELECTOR_HIGH = 1, + PINCTRL_REQUEST_RESERVED_LOW = 2, + PINCTRL_REQUEST_RESERVED_HIGH = 31 + } function_request_flags_bits; +}; + +struct arm_scmi_pin_control_release { + struct { + uint32_t identifier; + uint32_t flags; + } parameters; + /* enums for flags */ + enum { + PINCTRL_RELEASE_SELECTOR_LOW = 0, + PINCTRL_RELEASE_SELECTOR_HIGH = 1, + PINCTRL_RELEASE_RESERVED_LOW = 2, + PINCTRL_RELEASE_RESERVED_HIGH = 31 + } function_release_flags_bits; +}; + +struct arm_scmi_pin_control_set_permissions { + struct { + uint32_t agent_id; + uint32_t identifier; + uint32_t flags; + } parameters; + /* enums for flags */ + enum { + PINCTRL_SET_PERMISSIONS_SELECTOR_LOW = 0, + PINCTRL_SET_PERMISSIONS_SELECTOR_HIGH = 1, + PINCTRL_SET_PERMISSIONS_PERMISSION_LOW = 2, + PINCTRL_SET_PERMISSIONS_PERMISSION_HIGH = 2, + PINCTRL_SET_PERMISSIONS_RESERVED_LOW = 3, + PINCTRL_SET_PERMISSIONS_RESERVED_HIGH = 31 + } set_permissions_flags_bits; +}; + +struct arm_scmi_pin_control_name_get { + struct { + uint32_t identifier; + uint32_t flags; + } parameters; + struct { + uint32_t flags; + uint8_t name[64]; + } returns; + /* enums for parameters flags */ + enum { + PINCTRL_NAME_SELECTOR_LOW = 0, + PINCTRL_NAME_SELECTOR_HIGH = 1, + PINCTRL_NAME_RESERVED_LOW = 2, + PINCTRL_NAME_RESERVED_HIGH = 31 + } name_flags_bits; + +}; + +#endif /* PIN_CONTROL_COMMON_H_ */ diff --git a/platform/mocker/mocker/include/pin_control_protocol.h b/platform/mocker/mocker/include/pin_control_protocol.h new file mode 100644 index 0000000000000000000000000000000000000000..ffe3abaa21f9d419f138eea863a2e17b76239b31 --- /dev/null +++ b/platform/mocker/mocker/include/pin_control_protocol.h @@ -0,0 +1,111 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef PIN_CONTROL_PROTOCOL_H_ +#define PIN_CONTROL_PROTOCOL_H_ + +#include +#include + +#define PINCTRL_VERSOIN 0x00010000 +#define RESERVED 0 +#define PINCTRL_PROTO_ID 0x19 +#define FLAG_PINS 0 +#define FLAG_GROUPS 1 +#define FLAG_FUNCTIONS 2 + +#define MAX_NUM_PIN 4 +#define MAX_NUM_GROUP 2 + +#define PINCTRL_PROTO_VER_MSG_ID 0x0 +#define PINCTRL_PROTO_ATTRIB_MSG_ID 0x1 +#define PINCTRL_PROTO_MSG_ATTRIB_MSG_ID 0x2 +#define PINCTRL_ATTRIB_MSG_ID 0x3 +#define PINCTRL_LIST_ASSOC_MSG_ID 0x4 +#define PINCTRL_CONFIG_GET_MSG_ID 0x5 +#define PINCTRL_CONFIG_SET_MSG_ID 0x6 +#define PINCTRL_FUNC_SELECT_MSG_ID 0x7 +#define PINCTRL_REQUEST_MSG_ID 0x8 +#define PINCTRL_RELEASE_MSG_ID 0x9 +#define PINCTRL_NAME_GET_MSG_ID 0xA +#define PINCTRL_SET_PERM_MSG_ID 0xB + +struct arm_scmi_pin_control_config_default { + uint32_t type; + uint32_t value; +}; + +struct pinctrl_access_info +{ + char *name; + bool access; +}; + +struct arm_scmi_pin_control_protocol { + /* + * This enum is to specify the flag_mask and have to be ensured that + * it is in the same order as the below structure elements after + *num_pins flags_mask member. + */ + enum { + PIN_CONTROL_PROTOCOL_VERSION, + PIN_CONTROL_NUMBER_GROUPS, + PIN_CONTROL_NUMBER_PINS, + PIN_CONTROL_NUMBER_FUNCTIONS, + PIN_CONTROL_NUMBER_PINS_IN_GROUP, + PIN_CONTROL_NUMBER_GROUPS_IN_FUNCTIONS, + PIN_CONTROL_PIN_NAME, + PIN_CONTROL_GROUP_NAME, + PIN_CONTROL_FUNCTION_NAME, + PIN_CONTROL_GROUP_ASSOCIATIONS, + PIN_CONTROL_FUNCTION_ASSOCIATIONS, + PIN_CONTROL_EXTENDED_NAME_SUPPORT + } FLAGS; + /* + * The expectation is that there is no more + * than 32 elements specified via this expected results data structure. + * This mask is used to indicate which of the structure members hold valid + * data. + */ + uint32_t flags_mask; + uint32_t protocol_version; + + /* number of pin groups */ + uint32_t number_groups; + /* number of pins */ + uint32_t number_pins; + /* number of functions */ + uint32_t number_functions; + + /* number of pins in the group*/ + uint16_t *number_pins_in_group; + /* number of groups associated with the function*/ + uint16_t *number_groups_in_function; + /* + * This should have the names of the domains in this platform bounded by the + * number of domains descriptors. + */ + char **pin_name; + char **group_name; + char **function_name; + /* Array of group or pin identifiers*/ + uint32_t **group_associations; + uint32_t **function_associations; + uint32_t **pin_control_extended_name_support; +}; + +#endif /* PIN_CONTROL_PROTOCOL_H_ */ diff --git a/platform/mocker/mocker/include/power_domain_protocol.h b/platform/mocker/mocker/include/power_domain_protocol.h index bfd181c4b214b7f68e9e56dd7bb9be732394dd61..6d17a22562f93f5cbed0ec49682263246d3b157b 100644 --- a/platform/mocker/mocker/include/power_domain_protocol.h +++ b/platform/mocker/mocker/include/power_domain_protocol.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -75,10 +75,10 @@ struct arm_scmi_power_protocol { uint8_t *power_state_notification_support; /* This should have power synchronous support info for each power domain in * this platform bounded by the num_power_domains variable */ - uint8_t *power_synchronous_support; + uint32_t *power_synchronous_support; /* This should have power asynchronous support info for each power domain in * this platform bounded by the num_power_domains variable */ - uint8_t *power_asynchronous_support; + uint32_t *power_asynchronous_support; /* This should have the list of power domain names in the platform bounded * by the num_power_domains variable */ char **power_domain_names; diff --git a/platform/mocker/mocker/include/powercap_common.h b/platform/mocker/mocker/include/powercap_common.h new file mode 100644 index 0000000000000000000000000000000000000000..b1dd24f62f8399e175d6ff76ffebee0ee421c99a --- /dev/null +++ b/platform/mocker/mocker/include/powercap_common.h @@ -0,0 +1,191 @@ +/** @file + * Copyright (c) 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef POWERCAP_COMMON_H_ +#define POWERCAP_COMMON_H_ + +#include + +/* Structure for powercap protocol version*/ +struct arm_scmi_powercap_protocol_version { + struct { + uint32_t version; + } returns; +}; + +struct arm_scmi_powercap_protocol_attributes { + struct { + uint32_t attributes; + } returns; + + enum { + POWERCAP_ATTRIBUTES_LOW = 0, + POWERCAP_ATTRIBUTES_HIGH = 15, + POWERCAP_RESERVED_LOW = 16, + POWERCAP_RESERVED_HIGH = 31 + } attributes_bits; +}; + +struct arm_scmi_powercap_protocol_message_attributes { + struct { + uint32_t message_id; + } parameters; + struct { + uint32_t attributes; + } returns; + + enum { + POWERCAP_FASTCHANNEL_SUPPORT_LOW = 0, + POWERCAP_FASTCHANNEL_SUPPORT_HIGH = 0, + POWERCAP_MSG_RESERVED_LOW = 1, + POWERCAP_MSG_RESERVED_HIGH = 31 + } powercap_attributes_bits; +}; + +struct arm_scmi_powercap_domain_attributes { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t attributes; + uint8_t name[16]; + uint32_t min_pai; + uint32_t max_pai; + uint32_t pai_step; + uint32_t min_power_cap; + uint32_t max_power_cap; + uint32_t power_cap_step; + uint32_t sustainable_power; + uint32_t accuracy; + uint32_t parent_id; + } returns; + + enum { + POWERCAP_DOMAIN_RESERVED_LOW = 0, + POWERCAP_DOMAIN_RESERVED_HIGH = 21, + POWERCAP_DOMAIN_FASTCHANNEL_LOW = 22, + POWERCAP_DOMAIN_FASTCHANNEL_HIGH = 22, + POWERCAP_DOMAIN_UNIT_LOW = 23, + POWERCAP_DOMAIN_UNIT_HIGH = 24, + POWERCAP_DOMAIN_PAI_CONFIG_SUPPORT_LOW = 25, + POWERCAP_DOMAIN_PAI_CONFIG_SUPPORT_HIGH = 25, + POWERCAP_DOMAIN_MONITOR_SUPPORT_LOW = 26, + POWERCAP_DOMAIN_MONITOR_SUPPORT_HIGH = 26, + POWERCAP_DOMAIN_CONFIG_SUPPORT_LOW = 27, + POWERCAP_DOMAIN_CONFIG_SUPPORT_HIGH = 27, + POWERCAP_DOMAIN_EXT_NAME_SUPPORT_LOW = 28, + POWERCAP_DOMAIN_EXT_NAME_SUPPORT_HIGH = 28, + POWERCAP_DOMAIN_ASYNC_CAP_SET_SUPPORT_LOW = 29, + POWERCAP_DOMAIN_ASYNC_CAP_SET_SUPPORT_HIGH = 29, + POWERCAP_DOMAIN_MEASURE_NOTIFY_SUPPORT_LOW = 30, + POWERCAP_DOMAIN_MEASURE_NOTIFY_SUPPORT_HIGH = 30, + POWERCAP_DOMAIN_CHANGE_NOTIFY_SUPPORT_LOW = 31, + POWERCAP_DOMAIN_CHANGE_NOTIFY_SUPPORT_HIGH = 31, + } domain_attributes_bits; +}; + +struct arm_scmi_powercap_cap_get { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t power_cap; + } returns; +}; + +struct arm_scmi_powercap_cap_set { + struct { + uint32_t domain_id; + uint32_t flags; + uint32_t power_cap; + } parameters; + + enum { + POWERCAP_CAP_SET_DELAYED_RESPONSE_LOW = 0, + POWERCAP_CAP_SET_DELAYED_RESPONSE_HIGH = 0, + POWERCAP_CAP_SET_ASYNC_FLAG_LOW = 1, + POWERCAP_CAP_SET_ASYNC_FLAG_HIGH = 1, + POWERCAP_CAP_SET_RESERVED_LOW = 2, + POWERCAP_CAP_SET_RESERVED_HIGH = 31, + } cap_set_flags_bits; +}; + +struct arm_scmi_powercap_pai_get { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t pai; + } returns; +}; + +struct arm_scmi_powercap_pai_set { + struct { + uint32_t domain_id; + uint32_t flags; + uint32_t pai; + } parameters; +}; + +struct arm_scmi_powercap_measurements_get { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t power; + uint32_t pai; + } returns; +}; + +struct arm_scmi_powercap_domain_name_get { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t flags; + uint8_t name[64]; + } returns; +}; + +struct arm_scmi_powercap_cap_notify { + struct { + uint32_t domain_id; + uint32_t notify_enable; + } parameters; + enum { + POWERCAP_CAP_NOTIFY_ENABLE_LOW = 0, + POWERCAP_CAP_NOTIFY_ENABLE_HIGH = 0, + POWERCAP_CAP_NOTIFY_RESERVED_LOW = 1, + POWERCAP_CAP_NOTIFY_RESERVED_HIGH = 31 + } cap_notify_enable_bits; +}; + +struct arm_scmi_powercap_measurements_notify { + struct { + uint32_t domain_id; + uint32_t notify_enable; + uint32_t power_thresh_low; + uint32_t power_thresh_high; + } parameters; + enum { + POWERCAP_MEASURE_NOTIFY_ENABLE_LOW = 0, + POWERCAP_MEASURE_NOTIFY_ENABLE_HIGH = 0, + POWERCAP_MEASURE_RESERVED_LOW = 1, + POWERCAP_MEASURE_RESERVED_HIGH = 31 + } measure_notify_enable_bits; +}; +#endif /* POWERCAP_COMMON_H_ */ diff --git a/platform/mocker/mocker/include/powercap_protocol.h b/platform/mocker/mocker/include/powercap_protocol.h new file mode 100644 index 0000000000000000000000000000000000000000..ac1b495de4448ffc85f1559132adc7c50d4be477 --- /dev/null +++ b/platform/mocker/mocker/include/powercap_protocol.h @@ -0,0 +1,96 @@ +/** @file + * Copyright (c) 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef POWERCAP_PROTOCOL_H_ +#define POWERCAP_PROTOCOL_H_ + +#include +#include + +#define POWERCAP_VERSION 0x00010000 + +#define POWERCAP_PROTO_ID 0x18 +#define POWERCAP_PROTO_VER_MSG_ID 0x0 +#define POWERCAP_PROTO_ATTR_MSG_ID 0x1 +#define POWERCAP_PROTO_MSG_ATTR_MSG_ID 0x2 +#define POWERCAP_DOMAIN_ATTR_MSG_ID 0x3 +#define POWERCAP_CAP_GET_MSG_ID 0x4 +#define POWERCAP_CAP_SET_MSG_ID 0x5 +#define POWERCAP_PAI_GET_MSG_ID 0x6 +#define POWERCAP_PAI_SET_MSG_ID 0x7 +#define POWERCAP_DOMAIN_NAME_GET_MSG_ID 0x8 +#define POWERCAP_MEASUREMENTS_GET_MSG_ID 0x9 +#define POWERCAP_CAP_NOTIFY_MSG_ID 0xA +#define POWERCAP_MEASURMENTS_NOTIFY_MSG_ID 0xB + +struct arm_scmi_powercap_protocol { + /* + * This enum is to specify the flag_mask and have to be ensured that + * it is in the same order as the below structure elements after + * flags_mask member. + */ + enum { + POWERCAP_DOMAIN_PROTOCOL_VERSION = 1, + POWERCAP_NUMBER_DOMAINS, + POWERCAP_DOMAIN_NAME, + POWERCAP_MIN_PAI, + POWERCAP_MAX_PAI, + POWERCAP_PAI_STEP, + POWERCAP_MIN_POWER_CAP, + POWERCAP_MAX_POWER_CAP, + POWERCAP_POWER_CAP_STEP, + POWERCAP_SUSTAINABLE_POWER, + POWERCAP_ACCURACY, + POWERCAP_PAI, + POWERCAP_POWER_CAP, + POWERCAP_AVERAGE_POWER, + POWERCAP_EXTENDED_NAME_SUPPORT + } FLAGS; + /* + * The expectation is that there is no more + * than 32 elements specified via this expected results data structure. + * This mask is used to indicate which of the structure members hold valid + * data. + */ + uint32_t flags_mask; + uint32_t protocol_version; + + uint32_t number_domains; + + int32_t powercap_level; + + uint32_t *min_pai; + uint32_t *max_pai; + uint32_t *pai_step; + uint32_t *min_power_cap; + uint32_t *max_power_cap; + uint32_t *power_cap_step; + uint32_t *sustainable_power; + uint32_t *accuracy; + uint32_t *pai; + uint32_t *power_cap; + uint32_t *avg_power; + uint32_t *powercap_extended_name_support; + + int32_t invalid_powercap_level; + /* + * This should have the names of the domains in this platform bounded by the + * number of domains descriptors. + */ + char **powercap_domain_name; +}; +#endif /* POWERCAP_PROTOCOL_H_ */ diff --git a/platform/mocker/mocker/include/voltage_common.h b/platform/mocker/mocker/include/voltage_common.h index a5d6636ecd4f8acbf84938c8978d84444cfa932d..f00a432b38259f33a48e034a48ea92ecf6f13565 100644 --- a/platform/mocker/mocker/include/voltage_common.h +++ b/platform/mocker/mocker/include/voltage_common.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,6 +20,8 @@ #include +#define SCMI_MAX_DESCRIBE_LEVELS 4 + /* Structure for voltage protocol version*/ struct arm_scmi_voltage_protocol_version { struct { @@ -27,4 +29,155 @@ struct arm_scmi_voltage_protocol_version { } returns; }; +struct arm_scmi_voltage_protocol_attributes { + struct { + uint32_t attributes; + } returns; + + enum { + VOLTAGE_ATTRIBUTES_LOW = 0, + VOLTAGE_ATTRIBUTES_HIGH = 15, + VOLTAGE_RESERVED_LOW = 16, + VOLTAGE_RESERVED_HIGH = 31 + } attributes_bits; +}; + +struct arm_scmi_voltage_protocol_message_attributes { + struct { + uint32_t message_id; + } parameters; + struct { + uint32_t attributes; + } returns; +}; + + +struct arm_scmi_voltage_domain_attributes { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t attributes; + uint8_t name[16]; + } returns; + + enum { + VOLTAGE_DOMAIN_RESERVED_LOW = 0, + VOLTAGE_DOMAIN_RESERVED_HIGH = 31, + } domain_attributes_bits; + +}; + +struct arm_scmi_voltage_domain_attributes_v2 { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t attributes; + uint8_t name[16]; + } returns; + + enum { + VOLTAGE_DOMAIN_RESERVED_LOW_V2 = 0, + VOLTAGE_DOMAIN_RESERVED_HIGH_V2 = 29, + VOLTAGE_EXTENDED_DOMAIN_NAME_LOW_V2 = 30, + VOLTAGE_EXTENDED_DOMAIN_NAME_HIGH_V2 = 30, + VOLTAGE_DOMAIN_LEVEL_SET_LOW_V2 = 31, + VOLTAGE_DOMAIN_LEVEL_SET_HIGH_V2 = 31 + } domain_attributes_bits_v2; +}; + +struct arm_scmi_voltage_describe_levels { + struct { + uint32_t domain_id; + uint32_t level_index; + } parameters; + struct { + uint32_t flags; + int32_t voltage[SCMI_MAX_DESCRIBE_LEVELS]; + } returns; + + enum { + VOLTAGE_DESCRIBE_LEVELS_LOW = 0, + VOLTAGE_DESCRIBE_LEVELS_HIGH = 11, + VOLTAGE_DESCRIBE_RETURN_FORMAT_LOW = 12, + VOLTAGE_DESCRIBE_RETURN_FORMAT_HIGH = 12, + VOLTAGE_DESCRIBE_RESERVED_LOW = 13, + VOLTAGE_DESCRIBE_RESERVED_HIGH = 15, + VOLTAGE_DESCRIBE_REMAINING_LEVEL_LOW = 16, + VOLTAGE_DESCRIBE_REMAINING_LEVEL_HIGH = 31 + } describe_flags_bits; +}; + +struct arm_scmi_voltage_config_set { + struct { + uint32_t domain_id; + uint32_t config; + } parameters; + + enum { + VOLTAGE_CONFIG_SET_MODE_LOW = 0, + VOLTAGE_CONFIG_SET_MODE_HIGH = 3, + VOLTAGE_CONFIG_SET_RESERVED_LOW = 4, + VOLTAGE_CONFIG_SET_RESERVED_HIGH = 31, + } voltage_set_config_bits; + +}; + +struct arm_scmi_voltage_config_get { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t config; + } returns; + + enum { + VOLTAGE_CONFIG_GET_MODE_LOW = 0, + VOLTAGE_CONFIG_GET_MODE_HIGH = 3, + VOLTAGE_CONFIG_GET_RESERVED_LOW = 4, + VOLTAGE_CONFIG_GET_RESERVED_HIGH = 31, + } voltage_get_config_bits; + +}; + +struct arm_scmi_voltage_level_get { + struct { + uint32_t domain_id; + } parameters; + struct { + int32_t voltage_level; + } returns; +}; + +struct arm_scmi_voltage_level_set { + struct { + uint32_t domain_id; + uint32_t flags; + int32_t voltage_level; + } parameters; + + enum { + VOLTAGE_LEVEL_SET_OPERATION_LOW = 0, + VOLTAGE_LEVEL_SET_OPERATION_HIGH = 0, + VOLTAGE_LEVEL_SET_RESERVED_LOW = 1, + VOLTAGE_LEVEL_SET_RESERVED_HIGH = 31 + } level_flags_bits; +}; + +struct arm_scmi_voltage_domain_name_get { + struct { + uint32_t domain_id; + } parameters; + struct { + uint32_t flags; + uint8_t name[64]; + } returns; + + enum { + VOLTAGE_DOMAIN_NAME_GET_RESERVED_LOW = 0, + VOLTAGE_DOMAIN_NAME_GET_RESERVED_HIGH = 31 + } name_flags_bits; +}; + #endif /* VOLTAGE_COMMON_H_ */ diff --git a/platform/mocker/mocker/include/voltage_protocol.h b/platform/mocker/mocker/include/voltage_protocol.h index 862ae21dd415c2d4d98ab775fda639a211e4de50..6d0a862b46c617c1e4a3d0cff7160256ffdf30af 100644 --- a/platform/mocker/mocker/include/voltage_protocol.h +++ b/platform/mocker/mocker/include/voltage_protocol.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,11 +21,19 @@ #include #include -#define VOLTAGE_VERSION 0x00010000 +#define VOLTAGE_VERSION 0x00020000 #define VOLTAGE_PROTO_ID 0x17 #define VOLTAGE_PROTO_VER_MSG_ID 0x0 - +#define VOLTAGE_PROTO_ATTR_MSG_ID 0x1 +#define VOLTAGE_PROTO_MSG_ATTR_MSG_ID 0x2 +#define VOLTAGE_DOMAIN_ATTR_MSG_ID 0x3 +#define VOLTAGE_DESCRIBE_LEVELS_MSG_ID 0x4 +#define VOLTAGE_CONFIG_SET_MSG_ID 0x5 +#define VOLTAGE_CONFIG_GET_MSG_ID 0x6 +#define VOLTAGE_LEVEL_SET_MSG_ID 0x7 +#define VOLTAGE_LEVEL_GET_MSG_ID 0x8 +#define VOLTAGE_DOMAIN_NAME_GET_MSG_ID 0x9 struct arm_scmi_voltage_protocol { /* @@ -36,7 +44,9 @@ struct arm_scmi_voltage_protocol { enum { VOLTAGE_DOMAIN_PROTOCOL_VERSION = 1, VOLTAGE_NUMBER_DOMAINS, - VOLTAGE_DOMAIN_NAME + VOLTAGE_DOMAIN_NAME, + VOLTAGE_DESCRIBE_LEVELS, + VOLTAGE_OPERATIONAL_LEVEL } FLAGS; /* * The expectation is that there is no more @@ -52,6 +62,9 @@ struct arm_scmi_voltage_protocol { int32_t voltage_level; int32_t invalid_voltage_level; + + uint32_t **voltage_describe_levels; + uint32_t *operational_level; /* * This should have the names of the domains in this platform bounded by the * number of domains descriptors. diff --git a/platform/mocker/mocker/transport_base.c b/platform/mocker/mocker/transport_base.c index f9e0a41c9e60c0a42e124938933dca2acf1e0ea4..a80466022e9e8fb70c5b50acae3a3d476881de2b 100644 --- a/platform/mocker/mocker/transport_base.c +++ b/platform/mocker/mocker/transport_base.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -177,7 +177,8 @@ void base_send_message(uint32_t message_id, uint32_t parameter_count, case BASE_DISC_VENDOR_MSG_ID: *status = SCMI_STATUS_SUCCESS; sprintf((char *)return_values, "%s", base_protocol.vendor_identifier); - *return_values_count = strlen((const char*)return_values); + /* Taking max vendor string size to be 25 */ + *return_values_count = strnlen((const char*)return_values, 25); break; case BASE_DISC_SUBVENDOR_MSG_ID: if(base_protocol.subvendor_cmd_supported == false) @@ -187,7 +188,8 @@ void base_send_message(uint32_t message_id, uint32_t parameter_count, } *status = SCMI_STATUS_SUCCESS; sprintf((char *)return_values, "%s", base_protocol.subvendor_identifier); - *return_values_count = strlen((const char*)return_values); + /* Taking max subvendor string size to be 25 */ + *return_values_count = strnlen((const char*)return_values, 25); break; case BASE_DISC_IMPLEMENTATION_VERSION_MSG_ID: *status = SCMI_STATUS_SUCCESS; @@ -241,7 +243,8 @@ void base_send_message(uint32_t message_id, uint32_t parameter_count, (parameters[parameter_idx] == 0 ? "platform_mock" : agent_name_get(parameters[parameter_idx]))); } - *return_values_count = strlen((const char*)return_values) + 1; + /* Taking max agent string size to be 25 */ + *return_values_count = strnlen((const char*)return_values, 25) + 1; } break; case BASE_NOTIFY_ERRORS_MSG_ID: diff --git a/platform/mocker/mocker/transport_clock.c b/platform/mocker/mocker/transport_clock.c index b3986512a54f9c024cbb3f24ba64bae6cde1a6bc..e057259d4b1e0cab58b35d2913b5112be543a3f2 100644 --- a/platform/mocker/mocker/transport_clock.c +++ b/platform/mocker/mocker/transport_clock.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,12 @@ struct arm_scmi_clock_protocol clock_protocol; static unsigned int clock_status[MAX_NUM_CLOCK]; struct arm_scmi_clock_rate clock_rate[MAX_NUM_CLOCK]; +static struct arm_scmi_clock_current_parent clock_parent[] = +{ + {1, 2}, + {2, 0} +}; + void fill_clock_protocol() { clock_protocol.protocol_version = CLOCK_VERSION; @@ -30,6 +36,7 @@ void fill_clock_protocol() clock_protocol.max_num_pending_async_rate_chg_supported = max_num_pending_async_rate_chg_supported; clock_protocol.num_rates = num_of_clock_rates; + clock_protocol.clock_parent_support = clock_parent_support; } void clock_send_message(uint32_t message_id, uint32_t parameter_count, @@ -37,7 +44,7 @@ void clock_send_message(uint32_t message_id, uint32_t parameter_count, size_t *return_values_count, uint32_t *return_values) { - uint32_t parameter_idx, return_idx, clock_id; + uint32_t parameter_idx, return_idx, clock_id, parent_id; char * str; int i, j; @@ -54,14 +61,15 @@ void clock_send_message(uint32_t message_id, uint32_t parameter_count, return_idx = OFFSET_RET(struct arm_scmi_clock_protocol_attributes, attributes); return_values[return_idx] = (clock_protocol.number_clocks << CLK_NUMBER_CLOCKS_LOW) | - (clock_protocol.max_num_pending_async_rate_chg_supported << - CLK_MAX_NUM_PENDING_ASYNC_RATE_CHGS_SPRT_LOW); + (clock_protocol.max_num_pending_async_rate_chg_supported << + CLK_MAX_NUM_PENDING_ASYNC_RATE_CHGS_SPRT_LOW); break; case CLK_PROTO_MSG_ATTRIB_MSG_ID: parameter_idx = OFFSET_PARAM( - struct arm_scmi_clock_protocol_message_attributes, - message_id); - if(parameters[parameter_idx] > CLK_CONFIG_SET_MSG_ID) + struct arm_scmi_clock_protocol_message_attributes, message_id); + + if((parameters[parameter_idx] > CLK_CONFIG_SET_MSG_ID) && + (parameters[parameter_idx] != CLK_CONFIG_GET_MSG_ID)) { *status = SCMI_STATUS_NOT_FOUND; return; @@ -69,26 +77,35 @@ void clock_send_message(uint32_t message_id, uint32_t parameter_count, *status = SCMI_STATUS_SUCCESS; *return_values_count = 1; return_values[OFFSET_RET( - struct arm_scmi_clock_protocol_message_attributes, - attributes)] = 0x0; + struct arm_scmi_clock_protocol_message_attributes, attributes)] = 0x0; break; case CLK_ATTRIB_MSG_ID: - parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_attributes, - clock_id); + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_attributes, clock_id); clock_id = parameters[parameter_idx]; + if (clock_id >= clock_protocol.number_clocks) { *status = SCMI_STATUS_NOT_FOUND; break; } + *status = SCMI_STATUS_SUCCESS; - *return_values_count = 6; - return_idx = OFFSET_RET(struct arm_scmi_clock_attributes, attributes); - return_values[return_idx] = clock_status[clock_id] & 0x1; - str = (char *) - (&return_values[OFFSET_RET( - struct arm_scmi_clock_attributes, - clock_name)]); - sprintf(str, "CLOCK_%d", parameters[0]); + if (clock_protocol.protocol_version == 0x00010000) { + *return_values_count = 6; + return_idx = OFFSET_RET(struct arm_scmi_clock_attributes, attributes); + return_values[return_idx] = clock_status[clock_id] & 0x1; + str = (char *) (&return_values[OFFSET_RET(struct arm_scmi_clock_attributes, + clock_name)]); + sprintf(str, "CLOCK_%d", parameters[0]); + } else { + *return_values_count = 6; + return_idx = OFFSET_RET(struct arm_scmi_clock_attributes_v2, attributes); + return_values[return_idx] = clock_protocol.clock_parent_support[clock_id] << + CLK_ATTRIBUTES_PARENT_SUPPORT_LOW_V2 | (clock_status[clock_id] & 0x1); + + str = (char *) (&return_values[OFFSET_RET(struct arm_scmi_clock_attributes_v2, + clock_name)]); + sprintf(str, "CLOCK_%d", parameters[0]); + } break; case CLK_DESC_RATE_MSG_ID: clock_id = parameters[OFFSET_PARAM(struct arm_scmi_clock_describe_rates, @@ -97,6 +114,7 @@ void clock_send_message(uint32_t message_id, uint32_t parameter_count, *status = SCMI_STATUS_NOT_FOUND; break; } + if (parameters[OFFSET_PARAM(struct arm_scmi_clock_describe_rates, rate_index)] >= clock_protocol.num_rates[clock_id]) { @@ -168,22 +186,148 @@ void clock_send_message(uint32_t message_id, uint32_t parameter_count, } break; case CLK_CONFIG_SET_MSG_ID: - parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_set, clock_id); + if (clock_protocol.protocol_version == 0x20001) + { + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_set_v4, clock_id); + clock_id = parameters[parameter_idx]; + if (clock_id >= clock_protocol.number_clocks) + { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_set_v4, attributes); + if (((parameters[parameter_idx] >> CLK_CONFIGSET_ATTR_ENABLED_V4) & 0x3) > 1) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + if (((parameters[parameter_idx] >> CLK_CONFIGSET_ATTR_OEM_CONFIG_LOW_V4) & 0xFF) == 0) + if (((parameters[parameter_idx] >> CLK_CONFIGSET_ATTR_ENABLED_V4) & 0x3) == 3) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + *status = SCMI_STATUS_SUCCESS; + clock_status[clock_id] = ((parameters[parameter_idx] >> + CLK_CONFIGSET_ATTR_ENABLED_V4) & 0x3); + } else { + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_set, clock_id); + clock_id = parameters[parameter_idx]; + if (clock_id >= clock_protocol.number_clocks) + { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_set, attributes); + if (parameters[parameter_idx] > 1) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + *status = SCMI_STATUS_SUCCESS; + clock_status[clock_id] = parameters[parameter_idx]; + } + break; + case CLK_CONFIG_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_get, clock_id); clock_id = parameters[parameter_idx]; if (clock_id >= clock_protocol.number_clocks) { *status = SCMI_STATUS_NOT_FOUND; break; } - parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_set, attributes); - if (parameters[parameter_idx] > 1) + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_config_get, flags); + if ((parameters[parameter_idx] >> CLK_CONFIGGET_RESERVED_LOW ) > 0) { *status = SCMI_STATUS_INVALID_PARAMETERS; break; } *status = SCMI_STATUS_SUCCESS; - clock_status[clock_id] = parameters[parameter_idx]; + return_values[OFFSET_RET(struct arm_scmi_clock_config_get, + attributes)] = 0; + return_values[OFFSET_RET(struct arm_scmi_clock_config_get, + config)] = clock_status[clock_id]; + return_values[OFFSET_RET(struct arm_scmi_clock_config_get, + oem_config_val)] = 0; + *return_values_count = 3; break; + case CLK_PARENT_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_parent_get, clock_id); + clock_id = parameters[parameter_idx]; + if (clock_id >= clock_protocol.number_clocks) + { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + if (clock_protocol.clock_parent_support[clock_id] == 0) { + *status = SCMI_STATUS_NOT_SUPPORTED; + break; + } + + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_clock_parent_get, parent_id); + *return_values_count = 1; + for (i = 0; i < clock_protocol.number_clocks; i++) { + if (clock_parent[i].clock_id == clock_id) + return_values[return_idx] = clock_parent[i].parent_id; + } + break; + + case CLK_PARENT_SET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_parent_set, clock_id); + clock_id = parameters[parameter_idx]; + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_parent_set, parent_id); + parent_id = parameters[parameter_idx]; + if (clock_id >= clock_protocol.number_clocks || parent_id >= clock_protocol.number_clocks) + { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + if(clock_id == parent_id) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + if (clock_protocol.clock_parent_support[clock_id] == 0) { + *status = SCMI_STATUS_NOT_SUPPORTED; + break; + } + + *status = SCMI_STATUS_SUCCESS; + for (i = 0; i < clock_protocol.number_clocks; i++) { + if (clock_parent[i].clock_id == clock_id) + clock_parent[i].parent_id = parent_id; + } + break; + + case CLK_POSSIBLE_PARENT_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_clock_possible_parents_get, clock_id); + clock_id = parameters[parameter_idx]; + + if (clock_id >= clock_protocol.number_clocks) + { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + if (clock_protocol.clock_parent_support[clock_id] == 0) { + *status = SCMI_STATUS_NOT_SUPPORTED; + break; + } + + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_clock_possible_parents_get, flags); + return_values[return_idx] = 2; + j = 0; + for (i = 0; i < clock_protocol.number_clocks; i++) { + if (clock_id != i) { + return_idx = OFFSET_RET(struct arm_scmi_clock_possible_parents_get, + possible_parents) + j++; + return_values[return_idx] = i; + } + } + *return_values_count = 1 + j; + break; + default: *status = SCMI_STATUS_NOT_FOUND; } diff --git a/platform/mocker/mocker/transport_performance.c b/platform/mocker/mocker/transport_performance.c index 5303af01ff046d3dbbea2ff6fc1abaeb120f5622..3c045c958df376f50169ff809e7c9a3ffdb7f124 100644 --- a/platform/mocker/mocker/transport_performance.c +++ b/platform/mocker/mocker/transport_performance.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -42,11 +42,15 @@ void fill_performance_protocol() performance_protocol.performance_rate_limit = performance_rate_limit; performance_protocol.performance_sustained_freq = performance_sustained_freq; performance_protocol.performance_sustained_level = performance_sustained_level; + performance_protocol.performance_domain_level_index_mode_support = + performance_domain_level_index_mode_support; performance_protocol.performance_domain_names = performance_domain_names; performance_protocol.num_performance_levels = perf_num_performance_levels; performance_protocol.performance_level_power_cost = perf_performance_level_power_costs; performance_protocol.performance_level_value = perf_performance_level_values; performance_protocol.performance_level_worst_latency = perf_performance_level_worst_latency; + performance_protocol.performance_level_indicative_frequency = + perf_performance_level_indicative_frequency; performance_protocol.performance_domain_fast_channel_support = perf_domain_fast_ch_support; performance_protocol.performance_message_fast_channel_support = perf_msg_fast_ch_support; performance_protocol.door_bell_support = perf_performance_fast_ch_doorbell_support; @@ -125,7 +129,44 @@ void performance_send_message(uint32_t message_id, uint32_t parameter_count, } break; case PERF_DOMAIN_ATTRIB_MSG_ID: + if (performance_protocol.protocol_version == 0x40000) { *status = (parameters[OFFSET_PARAM( + struct arm_scmi_performance_domain_attributes_v4, + domain_id)] >= performance_protocol.num_performance_domains ? + SCMI_STATUS_NOT_FOUND: SCMI_STATUS_SUCCESS); + domain_id = parameters[OFFSET_PARAM( + struct arm_scmi_performance_domain_attributes_v4, domain_id)]; + return_values[OFFSET_RET( + struct arm_scmi_performance_domain_attributes_v4, attributes)] = + (performance_protocol.set_limit_capable[domain_id] << + PERFORMANCE_DOMAIN_ATTR_LIMIT_SET_V4) | + (performance_protocol.set_performance_level_capable[domain_id] << + PERFORMANCE_DOMAIN_ATTR_LEVEL_SET_V4) | + (performance_protocol.performance_limit_notification_support[domain_id] << + PERFORMANCE_DOMAIN_ATTR_LIMIT_NOTIFY_V4) | + (performance_protocol.performance_level_notification_support[domain_id] << + PERFORMANCE_DOMAIN_ATTR_LEVEL_NOTIFY_V4) | + (performance_protocol.performance_domain_fast_channel_support[domain_id] << + PERFORMANCE_DOMAIN_ATTR_FASTCHANNEL_SUPPORT_V4) | + (performance_protocol.performance_domain_level_index_mode_support[domain_id] << + PERFORMANCE_DOMAIN_LEVEL_INDEX_MODE_SUPPORT_V4); + return_values[OFFSET_RET( + struct arm_scmi_performance_domain_attributes_v4, rate_limit)] = + (performance_protocol.performance_rate_limit[domain_id] << + PERFORMANCE_DOMAIN_ATTR_RATE_LIMIT_LOW_V4); + return_values[OFFSET_RET( + struct arm_scmi_performance_domain_attributes_v4, sustained_perf_level)] = + (performance_protocol.performance_sustained_level[domain_id]); + return_values[OFFSET_RET( + struct arm_scmi_performance_domain_attributes_v4,sustained_freq)] = + (performance_protocol.performance_sustained_freq[domain_id]); + str = (char *) + (&return_values[OFFSET_RET(struct arm_scmi_performance_domain_attributes_v4, name)]); + sprintf(str, "Domain_%d", domain_id); + *return_values_count = 5; + } + else { + *status = (parameters[OFFSET_PARAM( struct arm_scmi_performance_domain_attributes, domain_id)] >= performance_protocol.num_performance_domains ? SCMI_STATUS_NOT_FOUND: SCMI_STATUS_SUCCESS); @@ -157,34 +198,78 @@ void performance_send_message(uint32_t message_id, uint32_t parameter_count, (&return_values[OFFSET_RET(struct arm_scmi_performance_domain_attributes, name)]); sprintf(str, "Domain_%d", domain_id); *return_values_count = 5; + } break; case PERF_DESC_LVL_MSG_ID: - domain_id = parameters[OFFSET_PARAM(struct arm_scmi_performance_describe_levels,domain_id)]; - if(domain_id >= performance_protocol.num_performance_domains) - { - *status = SCMI_STATUS_NOT_FOUND; - return; - } - if(parameters[OFFSET_PARAM( - struct arm_scmi_performance_describe_levels,level_index)] >= - performance_protocol.num_performance_levels[domain_id]) - { - *status = SCMI_STATUS_INVALID_PARAMETERS; - return; - } - *status = SCMI_STATUS_SUCCESS; - return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels,num_levels)] = - performance_protocol.num_performance_levels[domain_id] << PERFORMANCE_DESC_LEVELS_NUM_LEVELS_LOW; - *return_values_count = 1; - for(i = 0; i < performance_protocol.num_performance_levels[domain_id]; i++) - { - return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels,perf_levels)+i*3] = - performance_protocol.performance_level_value[domain_id][i]; - return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels,perf_levels)+i*3+1] = - performance_protocol.performance_level_power_cost[domain_id][i]; - return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels,perf_levels)+i*3+2] = - performance_protocol.performance_level_worst_latency[domain_id][i]; - *return_values_count += 3; + if (performance_protocol.protocol_version == 0x00040000) { + domain_id = parameters[OFFSET_PARAM( + struct arm_scmi_performance_describe_levels_v4, domain_id)]; + if (domain_id >= performance_protocol.num_performance_domains) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + if (parameters[OFFSET_PARAM( + struct arm_scmi_performance_describe_levels_v4, skip_index)] >= + performance_protocol.num_performance_levels[domain_id]) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + *status = SCMI_STATUS_SUCCESS; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels_v4, num_levels)] = + performance_protocol.num_performance_levels[domain_id] << + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_LOW_V4; + *return_values_count = 1; + for (i = 0; i < performance_protocol.num_performance_levels[domain_id]; i++) + { + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels_v4, + perf_levels)+i*5] = performance_protocol.performance_level_value[domain_id][i]; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels_v4, + perf_levels)+i*5+1] = + performance_protocol.performance_level_power_cost[domain_id][i]; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels_v4, + perf_levels)+i*5+2] + = performance_protocol.performance_level_worst_latency[domain_id][i]; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels_v4, + perf_levels)+i*5+3] + = performance_protocol.performance_level_indicative_frequency[domain_id][i]; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels_v4, + perf_levels)+i*5+4] = 0; + *return_values_count += 5; + } + } else { + domain_id = parameters[OFFSET_PARAM(struct arm_scmi_performance_describe_levels,domain_id)]; + if(domain_id >= performance_protocol.num_performance_domains) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + if(parameters[OFFSET_PARAM( + struct arm_scmi_performance_describe_levels,level_index)] >= + performance_protocol.num_performance_levels[domain_id]) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + *status = SCMI_STATUS_SUCCESS; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels,num_levels)] = + performance_protocol.num_performance_levels[domain_id] << + PERFORMANCE_DESC_LEVELS_NUM_LEVELS_LOW; + *return_values_count = 1; + for(i = 0; i < performance_protocol.num_performance_levels[domain_id]; i++) + { + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels, + perf_levels)+i*3] = + performance_protocol.performance_level_value[domain_id][i]; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels, + perf_levels)+i*3+1] = + performance_protocol.performance_level_power_cost[domain_id][i]; + return_values[OFFSET_RET(struct arm_scmi_performance_describe_levels, + perf_levels)+i*3+2] = + performance_protocol.performance_level_worst_latency[domain_id][i]; + *return_values_count += 3; + } } break; case PERF_LIMIT_SET_MSG_ID: diff --git a/platform/mocker/mocker/transport_pin_control.c b/platform/mocker/mocker/transport_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..01a11ebf0e4cae679c3d5ef8d7e04e4c1255bfe7 --- /dev/null +++ b/platform/mocker/mocker/transport_pin_control.c @@ -0,0 +1,572 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include +#include +#include + +struct arm_scmi_pin_control_protocol pin_control_protocol; +struct arm_scmi_pin_control_config_default pin_config[MAX_NUM_PIN]; +struct arm_scmi_pin_control_config_default group_config[MAX_NUM_GROUP]; + +void fill_pin_control_protocol() +{ + pin_control_protocol.protocol_version = PINCTRL_VERSOIN; + pin_control_protocol.number_groups = num_groups; + pin_control_protocol.number_pins = num_pins; + pin_control_protocol.number_functions = num_functions; + pin_control_protocol.number_pins_in_group = num_pins_in_group; + pin_control_protocol.number_groups_in_function = num_groups_in_function; + pin_control_protocol.group_associations = group_associations; + pin_control_protocol.function_associations = function_associations; + pin_control_protocol.pin_control_extended_name_support = + pin_control_extended_name_support; +} +static struct pinctrl_access_info agent_pin_access[] = +{ +/* pin access */ + {"PIN_0", true}, + {"PIN_1", true}, + {"PIN_2", true}, + {"PIN_3", true} +}; + +static struct pinctrl_access_info agent_group_access[] = +{ + /* group access */ + {"GROUP_0", true}, + {"GROUP_1", true} +}; + +uint32_t pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) +{ + if(selector == FLAG_PINS && agent_pin_access[identifier].access != true) + return SCMI_STATUS_DENIED; + else + if(selector == FLAG_GROUPS && agent_group_access[identifier].access != true) + return SCMI_STATUS_DENIED; + + return SCMI_STATUS_SUCCESS; +} + +void pin_control_send_message(uint32_t message_id, uint32_t parameter_count, + const uint32_t *parameters, int32_t *status, + size_t *return_values_count, uint32_t *return_values) +{ + uint32_t return_idx = 0; + uint32_t pc_id = 0, parameter_idx = 0; + uint32_t flags = 0, function_id = 0; + char * str; + uint32_t i, total_num_configs, all_configs; + uint32_t access; + char name[64]; + + switch(message_id) + { + case PINCTRL_PROTO_VER_MSG_ID: + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + return_values[0] = pin_control_protocol.protocol_version; + break; + case PINCTRL_PROTO_ATTRIB_MSG_ID: + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 2; + return_idx = OFFSET_RET(struct arm_scmi_pin_control_protocol_attributes, attributes_low); + return_values[return_idx] = + (pin_control_protocol.number_pins << PINCTRL_NUM_PINS_LOW) + + (pin_control_protocol.number_groups << PINCTRL_NUM_PIN_GROUPS_LOW); + return_values[OFFSET_RET( + struct arm_scmi_pin_control_protocol_attributes, + attributes_high)] = + (pin_control_protocol.number_functions << PINCTRL_NUM_FUNCTIONS_LOW) + + (RESERVED << PINCTRL_NUM_RESERVED_LOW); + break; + case PINCTRL_PROTO_MSG_ATTRIB_MSG_ID: + parameter_idx = OFFSET_PARAM( + struct arm_scmi_pin_control_protocol_message_attributes, message_id); + if(parameters[parameter_idx] > PINCTRL_SET_PERM_MSG_ID) { + *status = SCMI_STATUS_NOT_FOUND; + } else { + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + return_values[OFFSET_RET( + struct arm_scmi_pin_control_protocol_message_attributes, + attributes)] = 0x0; + } + break; + case PINCTRL_ATTRIB_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_attributes, + identifier); + pc_id = parameters[parameter_idx]; + + /* Get flag (pin or group or function) */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_attributes, + flags); + flags = parameters[parameter_idx]; + *status = SCMI_STATUS_SUCCESS; + + /* If flag is pin */ + if (flags == FLAG_PINS) { + if (pc_id >= pin_control_protocol.number_pins) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + *return_values_count = 2; + /* Get attributes */ + return_idx = OFFSET_RET(struct arm_scmi_pin_control_attributes, attributes); + return_values[return_idx] = + pin_control_protocol.pin_control_extended_name_support[flags][pc_id] << + PINCTRL_ATTRIBUTES_EXTENDED_NAME_LOW; + /* Get name */ + return_idx = OFFSET_RET(struct arm_scmi_pin_control_attributes, name); + str = (char *)&return_values[return_idx]; + if (pin_control_protocol.pin_control_extended_name_support[flags][pc_id]) { + sprintf(name,"pin_ext_uart_n_artx_%d", pc_id); + sprintf(str, "%s", name + strnlen(name, 25) - 16); + } else + sprintf(str, "pin_x%d", pc_id); + /* If flag id group */ + } else if (flags == FLAG_GROUPS) { + if (pc_id >= pin_control_protocol.number_groups) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + *return_values_count = 2; + /* Get attributes */ + return_idx = OFFSET_RET(struct arm_scmi_pin_control_attributes, attributes); + return_values[return_idx] = + pin_control_protocol.pin_control_extended_name_support[flags][pc_id] << + PINCTRL_ATTRIBUTES_EXTENDED_NAME_LOW | + (pin_control_protocol.number_pins_in_group[pc_id] << + PINCTRL_ATTRIBUTES_NUM_PINS_GROUPS_LOW); + /* Get name */ + return_idx = OFFSET_RET(struct arm_scmi_pin_control_attributes, name); + str = (char *)&return_values[return_idx]; + if (pin_control_protocol.pin_control_extended_name_support[flags][pc_id]) { + sprintf(name,"grp_ext_uart_n_artx_%d", pc_id); + sprintf(str, "%s", name + strnlen(name, 25) - 16); + } else + sprintf(str, "grp_rxtx_z%d", pc_id); + /* If flag is function */ + } else if (flags == FLAG_FUNCTIONS) { + if (pc_id >= pin_control_protocol.number_functions) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + *return_values_count = 2; + /* Get attributes */ + return_idx = OFFSET_RET(struct arm_scmi_pin_control_attributes, attributes); + return_values[return_idx] = + pin_control_protocol.pin_control_extended_name_support[flags][pc_id] << + PINCTRL_ATTRIBUTES_EXTENDED_NAME_LOW | + (pin_control_protocol.number_groups_in_function[pc_id] << + PINCTRL_ATTRIBUTES_NUM_PINS_GROUPS_LOW); + /* Get name */ + return_idx = OFFSET_RET(struct arm_scmi_pin_control_attributes, name); + str = (char *)&return_values[return_idx]; + if (pin_control_protocol.pin_control_extended_name_support[flags][pc_id]) { + sprintf(name,"f_ext_uart_n_artx_%d", pc_id); + sprintf(str, "%s", name + strnlen(name, 25) - 16); + } else + sprintf(str, "f_uart_w%d", pc_id); + } else { + *status = SCMI_STATUS_NOT_FOUND; + } + break; + case PINCTRL_LIST_ASSOC_MSG_ID: + parameter_idx = OFFSET_PARAM( + struct arm_scmi_pin_control_list_associations, list_parameters_flags); + flags = parameters[parameter_idx]; + + if (flags == FLAG_GROUPS) { + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_list_associations, + identifier); + pc_id = parameters[parameter_idx]; + /* Check if group identifier is valid */ + if (pc_id >= pin_control_protocol.number_groups) { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + /* Check if group index is valid */ + if(parameters[OFFSET_PARAM( + struct arm_scmi_pin_control_list_associations, index)] >= + pin_control_protocol.number_pins_in_group[pc_id]) + { + *status = SCMI_STATUS_OUT_OF_RANGE; + return; + } + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_pin_control_list_associations, + list_returns_flags); + return_values[return_idx] = pin_control_protocol.number_pins_in_group[pc_id] + << PINCTRL_LIST_RETURNS_FLAGS_NUM_IDENTIFIERS_LOW; + for (i = 0; i < pin_control_protocol.number_pins_in_group[pc_id]; i++) + { + return_values[OFFSET_RET(struct arm_scmi_pin_control_list_associations, array) + i] + = pin_control_protocol.group_associations[pc_id][i]; + } + *return_values_count = 2; + } else if (flags == FLAG_FUNCTIONS) { + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_list_associations, + identifier); + pc_id = parameters[parameter_idx]; + /* Check if function identifier is valid */ + if (pc_id >= pin_control_protocol.number_functions) { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + /* Check if funciton index is valid */ + if(parameters[OFFSET_PARAM( + struct arm_scmi_pin_control_list_associations, index)] >= + pin_control_protocol.number_groups_in_function[pc_id]) + { + *status = SCMI_STATUS_OUT_OF_RANGE; + return; + } + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_pin_control_list_associations, + list_returns_flags); + return_values[return_idx] = pin_control_protocol.number_groups_in_function[pc_id] + << PINCTRL_LIST_RETURNS_FLAGS_NUM_IDENTIFIERS_LOW; + for (i = 0; i < pin_control_protocol.number_groups_in_function[pc_id]; i++) + { + return_values[OFFSET_RET(struct arm_scmi_pin_control_list_associations, array) + i] + = pin_control_protocol.function_associations[pc_id][i]; + } + *return_values_count = 2; + } else { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + break; + case PINCTRL_CONFIG_GET_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_config_get, + identifier); + pc_id = parameters[parameter_idx]; + + flags = ((parameters[OFFSET_PARAM(struct arm_scmi_pin_control_config_get, attributes)] >> + PINCTRL_CONFIG_GET_SELECTOR_LOW) & 0x3); + + if (flags == FLAG_PINS) { + /* Check if pin identifier is valid */ + if (pc_id >= pin_control_protocol.number_pins) { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + if(!(agent_pin_access[pc_id].access)) { + *status = SCMI_STATUS_DENIED; + return; + } + + *status = SCMI_STATUS_SUCCESS; + + } else if (flags == FLAG_GROUPS) { + /* Check if group identifier is valid */ + if (pc_id >= pin_control_protocol.number_groups) { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + if(!(agent_group_access[pc_id].access)) { + *status = SCMI_STATUS_DENIED; + return; + } + *status = SCMI_STATUS_SUCCESS; + + } else { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_config_get, attributes); + all_configs = ((parameters[parameter_idx] >> PINCTRL_CONFIG_GET_ALLCONFIGS_LOW) & 0x1); + if (all_configs == 1) { + total_num_configs = 2; + return_idx = OFFSET_RET(struct arm_scmi_pin_control_config_get, num_configs); + return_values[return_idx] = total_num_configs; + + for (i = 0; i < total_num_configs; i++) { + return_values[OFFSET_RET(struct arm_scmi_pin_control_config_get, + configs) + i * total_num_configs] = i; + return_values[OFFSET_RET(struct arm_scmi_pin_control_config_get, + configs) + i * total_num_configs + 1] = 0; + + } + *return_values_count = 1 + (total_num_configs * 2); + } + else if (flags == FLAG_PINS) { + return_values[OFFSET_RET(struct arm_scmi_pin_control_config_get, + configs) ] = pin_config[pc_id].type; + return_values[OFFSET_RET(struct arm_scmi_pin_control_config_get, + configs) + 1] = pin_config[pc_id].value; + *return_values_count = 3; + } + else { + return_values[OFFSET_RET(struct arm_scmi_pin_control_config_get, + configs) ] = group_config[pc_id].type; + return_values[OFFSET_RET(struct arm_scmi_pin_control_config_get, + configs) + 1] = group_config[pc_id].value; + *return_values_count = 3; + } + + break; + case PINCTRL_CONFIG_SET_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_config_set, + identifier); + pc_id = parameters[parameter_idx]; + + flags = ((parameters[OFFSET_PARAM(struct arm_scmi_pin_control_config_set, attributes)] >> + PINCTRL_CONFIG_SET_SELECTOR_LOW) & 0x3); + if (flags == FLAG_PINS) { + /* Check if pin identifier is valid */ + if (pc_id >= pin_control_protocol.number_pins) { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + *status = SCMI_STATUS_SUCCESS; + + } else if (flags == FLAG_GROUPS) { + /* Check if group identifier is valid */ + if (pc_id >= pin_control_protocol.number_groups) { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + *status = SCMI_STATUS_SUCCESS; + + } else { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + total_num_configs = ((parameters[OFFSET_PARAM(struct arm_scmi_pin_control_config_set, + attributes)] >> PINCTRL_CONFIG_SET_NUM_CONFIGS_LOW) & 0xFF); + + if(flags == FLAG_PINS) { + if ((parameters[OFFSET_PARAM(struct arm_scmi_pin_control_config_set, configs)] > 20) && + (parameters[OFFSET_PARAM(struct arm_scmi_pin_control_config_set, configs)] < 192)) { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + pin_config[pc_id].type = parameters[OFFSET_PARAM(struct + arm_scmi_pin_control_config_set, configs)]; + pin_config[pc_id].value = parameters[OFFSET_PARAM(struct + arm_scmi_pin_control_config_set, configs) + 1]; + } + else { + if ((parameters[OFFSET_PARAM(struct arm_scmi_pin_control_config_set, configs)] > 20) && + (parameters[OFFSET_PARAM(struct arm_scmi_pin_control_config_set, configs)] < 192)) { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + group_config[pc_id].type = parameters[OFFSET_PARAM(struct + arm_scmi_pin_control_config_set, configs)]; + group_config[pc_id].value = parameters[OFFSET_PARAM(struct + arm_scmi_pin_control_config_set, configs) + 1]; + } + break; + case PINCTRL_FUNC_SELECT_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_function_select, + identifier); + pc_id = parameters[parameter_idx]; + + /* Get function id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_function_select, + function_id); + function_id = parameters[parameter_idx]; + if( function_id >= pin_control_protocol.number_functions) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + + /* Get flag (pin or group or function) */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_function_select, + flags); + flags = parameters[parameter_idx]; + *status = SCMI_STATUS_SUCCESS; + + /* If flag is pin */ + if (flags == FLAG_PINS) { + if (pc_id >= pin_control_protocol.number_pins) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + /* If flag is group */ + } else if (flags == FLAG_GROUPS) { + if (pc_id >= pin_control_protocol.number_groups) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + } else { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + break; + case PINCTRL_REQUEST_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_request, identifier); + pc_id = parameters[parameter_idx]; + /* Get flag (pin or group) */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_request, flags); + flags = parameters[parameter_idx]; + *status = SCMI_STATUS_SUCCESS; + + /* If flag is pin */ + if (flags == FLAG_PINS) { + if (pc_id >= pin_control_protocol.number_pins) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + /* If flag is group */ + } else if (flags == FLAG_GROUPS) { + if (pc_id >= pin_control_protocol.number_groups) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + } else { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + break; + case PINCTRL_RELEASE_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_release, identifier); + pc_id = parameters[parameter_idx]; + /* Get flag (pin or group) */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_release, flags); + flags = parameters[parameter_idx]; + *status = SCMI_STATUS_SUCCESS; + + /* If flag is pin */ + if (flags == FLAG_PINS) { + if (pc_id >= pin_control_protocol.number_pins) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + /* If flag is group */ + } else if (flags == FLAG_GROUPS) { + if (pc_id >= pin_control_protocol.number_groups) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + } else { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + break; + case PINCTRL_NAME_GET_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_release, identifier); + pc_id = parameters[parameter_idx]; + /* Get flag (pin or group) */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_release, flags); + flags = parameters[parameter_idx]; + *status = SCMI_STATUS_SUCCESS; + + /* If flag is pin */ + if (flags == FLAG_PINS) { + if (pc_id >= pin_control_protocol.number_pins) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + sprintf((char *)&return_values[1], "pin_ext_uart_n_artx_%d", pc_id); + + /* If flag is group */ + } else if (flags == FLAG_GROUPS) { + if (pc_id >= pin_control_protocol.number_groups) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + sprintf((char *)&return_values[1], "grp_ext_uart_n_artx_%d", pc_id); + + /* If flag is function */ + } else if (flags == FLAG_FUNCTIONS) { + if (pc_id >= pin_control_protocol.number_functions) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + sprintf((char *)&return_values[1], "f_ext_uart_n_artx_%d", pc_id); + + } else { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + return_idx = OFFSET_RET(struct arm_scmi_pin_control_name_get, flags); + return_values[return_idx] = 0; + *return_values_count = strnlen((const char*)return_values, 25) + 1; + break; + case PINCTRL_SET_PERM_MSG_ID: + /* Get pin control id */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_set_permissions, identifier); + pc_id = parameters[parameter_idx]; + /* Get flag (pin or group) */ + parameter_idx = OFFSET_PARAM(struct arm_scmi_pin_control_set_permissions, flags); + access = (parameters[parameter_idx] & 0x4) >> 2; + flags = parameters[parameter_idx]; + + /* Reserved bits[31:3] must be zero*/ + if ((flags & (~(0x7))) > 0) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + flags = parameters[parameter_idx] & 0x3; + /* If flag is pin */ + if (flags == FLAG_PINS) { + if (pc_id >= pin_control_protocol.number_pins) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + agent_pin_access[pc_id].access = access; + *status = SCMI_STATUS_SUCCESS; + return; + /* If flag is group */ + } else if (flags == FLAG_GROUPS) { + if (pc_id >= pin_control_protocol.number_groups) + { + *status = SCMI_STATUS_NOT_FOUND; + return; + } + agent_group_access[pc_id].access = access; + *status = SCMI_STATUS_SUCCESS; + return; + } else { + *status = SCMI_STATUS_INVALID_PARAMETERS; + return; + } + *status = SCMI_STATUS_NOT_FOUND; + break; + default: + *status = SCMI_STATUS_NOT_FOUND; + } +} diff --git a/platform/mocker/mocker/transport_power_domain.c b/platform/mocker/mocker/transport_power_domain.c index 50fed9dbcc497dc9a7857ca3b8d97c90b0a5c750..ad9c0ec10dd40aabfdf9487ded7603f38c72107b 100644 --- a/platform/mocker/mocker/transport_power_domain.c +++ b/platform/mocker/mocker/transport_power_domain.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ struct arm_scmi_power_protocol power_protocol; extern bool device_access_permitted (void); extern bool protocol_access_permitted (uint32_t protocol_id); + void fill_power_protocol() { power_protocol.protocol_version = POWER_DOMAIN_VERSION; @@ -33,6 +34,8 @@ void fill_power_protocol() power_protocol.statistics_address_low + power_protocol.statistics_length; power_protocol.power_state_notify_cmd_supported = true; power_protocol.power_state_change_requested_notify_cmd_supported = true; + power_protocol.power_synchronous_support = power_synchronous_support; + power_protocol.power_asynchronous_support = power_asynchronous_support; } void power_send_message(uint32_t message_id, uint32_t parameter_count, @@ -40,7 +43,7 @@ void power_send_message(uint32_t message_id, uint32_t parameter_count, size_t *return_values_count, uint32_t *return_values) { - uint32_t parameter_idx, return_idx; + uint32_t parameter_idx, return_idx, domain_id; char * str; int num_power_domains = 3; int stats_low = 0x1234, stats_high = stats_low + 0xff; @@ -87,9 +90,10 @@ void power_send_message(uint32_t message_id, uint32_t parameter_count, } break; case PWR_DOMAIN_ATTRIB_MSG_ID: - *status = (parameters[OFFSET_PARAM( + domain_id = parameters[OFFSET_PARAM( struct arm_scmi_power_domain_attributes, - domain_id)] > num_power_domains ? + domain_id)]; + *status = (domain_id > num_power_domains ? SCMI_STATUS_NOT_FOUND: SCMI_STATUS_SUCCESS); *return_values_count = 3; if(parameters[OFFSET_PARAM( @@ -99,8 +103,10 @@ void power_send_message(uint32_t message_id, uint32_t parameter_count, return_values[OFFSET_RET( struct arm_scmi_power_domain_attributes, attributes)] = - (1 << POWER_DOMAIN_ATTR_SYNC_LOW) + - (1 << POWER_DOMAIN_ATTR_ASYNC_LOW) + + (power_protocol.power_asynchronous_support[domain_id] + << POWER_DOMAIN_ATTR_SYNC_LOW) + + (power_protocol.power_synchronous_support[domain_id] + << POWER_DOMAIN_ATTR_ASYNC_LOW) + (0 << POWER_DOMAIN_ATTR_STATE_NOTIFICATIONS_LOW); } else @@ -108,8 +114,10 @@ void power_send_message(uint32_t message_id, uint32_t parameter_count, return_values[OFFSET_RET( struct arm_scmi_power_domain_attributes, attributes)] = - (1 << POWER_DOMAIN_ATTR_SYNC_LOW) + - (1 << POWER_DOMAIN_ATTR_ASYNC_LOW) + + (power_protocol.power_asynchronous_support[domain_id] + << POWER_DOMAIN_ATTR_SYNC_LOW) + + (power_protocol.power_synchronous_support[domain_id] + << POWER_DOMAIN_ATTR_ASYNC_LOW) + (1 << POWER_DOMAIN_ATTR_STATE_NOTIFICATIONS_LOW); } str = (char *) @@ -120,6 +128,7 @@ void power_send_message(uint32_t message_id, uint32_t parameter_count, domain_id)]); break; case PWR_STATE_SET_MSG_ID: + domain_id = parameters[OFFSET_PARAM(struct arm_scmi_power_state_set, domain_id)]; if ((parameters[OFFSET_PARAM(struct arm_scmi_power_state_set, power_state)] & (1 << POWER_STATE_SET_RESERVED_HIGH)) != 0) { *status = SCMI_STATUS_INVALID_PARAMETERS; @@ -130,20 +139,26 @@ void power_send_message(uint32_t message_id, uint32_t parameter_count, *status = SCMI_STATUS_INVALID_PARAMETERS; break; } - if (parameters[OFFSET_PARAM(struct arm_scmi_power_state_set, - domain_id)] >= num_power_domains) { + if (domain_id >= num_power_domains) { *status = SCMI_STATUS_NOT_FOUND; break; } + + if (power_protocol.power_synchronous_support[domain_id] !=1 || + power_protocol.power_synchronous_support[domain_id] !=1) { + *status = SCMI_STATUS_NOT_SUPPORTED; + break; + } *status = SCMI_STATUS_SUCCESS; break; case PWR_STATE_GET_MSG_ID: - if (parameters[OFFSET_PARAM( - struct arm_scmi_power_state_get, domain_id)] >= - num_power_domains) { + domain_id = parameters[OFFSET_PARAM(struct arm_scmi_power_state_get, domain_id)]; + + if (domain_id >= num_power_domains) { *status = SCMI_STATUS_NOT_FOUND; break; } + *status = SCMI_STATUS_SUCCESS; *return_values_count = 1; return_values[OFFSET_RET(struct arm_scmi_power_state_get, diff --git a/platform/mocker/mocker/transport_powercap.c b/platform/mocker/mocker/transport_powercap.c new file mode 100644 index 0000000000000000000000000000000000000000..2b66b75ebbf8c305fac3d9d93670c559091c1921 --- /dev/null +++ b/platform/mocker/mocker/transport_powercap.c @@ -0,0 +1,265 @@ +/** @file + * Copyright (c) 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#include +#include +#include + +struct arm_scmi_powercap_protocol powercap_protocol; + +void fill_powercap_protocol() +{ + powercap_protocol.protocol_version = POWERCAP_VERSION; + powercap_protocol.number_domains = num_powercap_domain; + powercap_protocol.powercap_domain_name = powercap_domain_name; + powercap_protocol.min_pai = min_pai; + powercap_protocol.max_pai = max_pai; + powercap_protocol.pai_step = pai_step; + powercap_protocol.min_power_cap = min_power_cap; + powercap_protocol.max_power_cap = max_power_cap; + powercap_protocol.power_cap_step = power_cap_step; + powercap_protocol.sustainable_power = sustainable_power; + powercap_protocol.accuracy = accuracy; + powercap_protocol.pai = pai; + powercap_protocol.power_cap = power_cap; + powercap_protocol.avg_power = avg_power; + powercap_protocol.powercap_extended_name_support = powercap_extended_name_support; +} + + +void powercap_send_message(uint32_t message_id, uint32_t parameter_count, + const uint32_t *parameters, int32_t *status, + size_t *return_values_count, uint32_t *return_values) +{ + uint32_t return_idx, parameter_idx, domain_id; + char *name; + switch(message_id) + { + case POWERCAP_PROTO_VER_MSG_ID: + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + return_values[0] = powercap_protocol.protocol_version; + break; + + case POWERCAP_PROTO_ATTR_MSG_ID: + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + return_idx = OFFSET_RET(struct arm_scmi_powercap_protocol_attributes, attributes); + return_values[return_idx] = powercap_protocol.number_domains; + break; + + case POWERCAP_PROTO_MSG_ATTR_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_protocol_message_attributes, + message_id); + + if (parameters[parameter_idx] == POWERCAP_CAP_NOTIFY_MSG_ID || + parameters[parameter_idx] == POWERCAP_MEASURMENTS_NOTIFY_MSG_ID) { + *status = SCMI_STATUS_SUCCESS; + break; + } + + if (parameters[parameter_idx] > POWERCAP_PAI_SET_MSG_ID) + *status = SCMI_STATUS_NOT_FOUND; + else { + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + return_idx = OFFSET_RET(struct arm_scmi_powercap_protocol_message_attributes, + attributes); + return_values[return_idx] = 0; + } + break; + + case POWERCAP_DOMAIN_ATTR_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_domain_attributes, domain_id); + domain_id = parameters[parameter_idx]; + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + name = powercap_protocol.powercap_domain_name[domain_id]; + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, attributes); + return_values[return_idx] = 0x1 << POWERCAP_DOMAIN_UNIT_LOW | + 0x1 << POWERCAP_DOMAIN_PAI_CONFIG_SUPPORT_LOW | + 0x1 << POWERCAP_DOMAIN_MONITOR_SUPPORT_LOW | + 0x1 << POWERCAP_DOMAIN_CONFIG_SUPPORT_LOW | + powercap_protocol.powercap_extended_name_support[domain_id] + << POWERCAP_DOMAIN_EXT_NAME_SUPPORT_LOW | + 0x1 << POWERCAP_DOMAIN_MEASURE_NOTIFY_SUPPORT_LOW | + 0x1 << POWERCAP_DOMAIN_CHANGE_NOTIFY_SUPPORT_LOW; + + if (powercap_protocol.powercap_extended_name_support[domain_id]) + sprintf((char*)&return_values[1], "%s", name + strnlen(name, 25) - 16); + else + sprintf((char *) &return_values[1], "%s", name); + + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, min_pai); + return_values[return_idx] = powercap_protocol.min_pai[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, max_pai); + return_values[return_idx] = powercap_protocol.max_pai[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, pai_step); + return_values[return_idx] = powercap_protocol.pai_step[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, min_power_cap); + return_values[return_idx] = powercap_protocol.min_power_cap[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, max_power_cap); + return_values[return_idx] = powercap_protocol.max_power_cap[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, power_cap_step); + return_values[return_idx] = powercap_protocol.power_cap_step[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, sustainable_power); + return_values[return_idx] = powercap_protocol.sustainable_power[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, accuracy); + return_values[return_idx] = powercap_protocol.accuracy[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_attributes, parent_id); + return_values[return_idx] = 0xFFFFFFFF; + *return_values_count = strnlen((const char*)return_values, 25) + 10; + break; + + case POWERCAP_CAP_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_cap_get, domain_id); + domain_id = parameters[parameter_idx]; + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_powercap_cap_get, power_cap); + return_values[return_idx] = powercap_protocol.power_cap[domain_id]; + *return_values_count = 1; + break; + + case POWERCAP_CAP_SET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_cap_set, domain_id); + domain_id = parameters[parameter_idx]; + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_cap_set, flags); + if (parameters[parameter_idx] > 3) { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_cap_set, power_cap); + if (parameters[parameter_idx] == 0) { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + + *status = SCMI_STATUS_SUCCESS; + break; + + case POWERCAP_PAI_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_pai_get, domain_id); + domain_id = parameters[parameter_idx]; + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_powercap_pai_get, pai); + return_values[return_idx] = powercap_protocol.pai[domain_id]; + *return_values_count = 1; + break; + + case POWERCAP_PAI_SET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_pai_set, domain_id); + domain_id = parameters[parameter_idx]; + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_pai_set, flags); + if (parameters[parameter_idx] != 0) { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_pai_set, pai); + if (parameters[parameter_idx] == 0) { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + *status = SCMI_STATUS_SUCCESS; + break; + + case POWERCAP_MEASUREMENTS_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_measurements_get, domain_id); + domain_id = parameters[parameter_idx]; + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + return_idx = OFFSET_RET(struct arm_scmi_powercap_measurements_get, power); + return_values[return_idx] = powercap_protocol.avg_power[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_powercap_measurements_get, pai); + return_values[return_idx] = powercap_protocol.pai[domain_id]; + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 2; + break; + + case POWERCAP_DOMAIN_NAME_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_domain_name_get, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + return_idx = OFFSET_RET(struct arm_scmi_powercap_domain_name_get, flags); + return_values[return_idx] = 0; + if (powercap_protocol.powercap_extended_name_support[domain_id]) { + *status = SCMI_STATUS_SUCCESS; + name = powercap_protocol.powercap_domain_name[domain_id]; + sprintf((char *)&return_values[1], "%s", name); + } else { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + *return_values_count = strnlen((const char*)return_values, 25) + 1; + break; + + case POWERCAP_CAP_NOTIFY_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_cap_notify, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + *status = SCMI_STATUS_SUCCESS; + break; + + case POWERCAP_MEASURMENTS_NOTIFY_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_powercap_measurements_notify, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= powercap_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + *status = SCMI_STATUS_SUCCESS; + break; + + default: + *status = SCMI_STATUS_NOT_FOUND;; + break; + } +} diff --git a/platform/mocker/mocker/transport_sensor.c b/platform/mocker/mocker/transport_sensor.c index 4c40c302fac701e7f9c0d344070e908474c20848..8214a396563a56c1b2e359d8f0b6eefe02fd9826 100644 --- a/platform/mocker/mocker/transport_sensor.c +++ b/platform/mocker/mocker/transport_sensor.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -51,6 +51,7 @@ void sensor_send_message(uint32_t message_id, uint32_t parameter_count, { uint32_t parameter_idx, return_idx, sensor_id, sensor_cfg; + static uint32_t sensor_config = 0xFFFFFFFF; char * str; int i; @@ -324,14 +325,19 @@ void sensor_send_message(uint32_t message_id, uint32_t parameter_count, *status = SCMI_STATUS_NOT_FOUND; break; } - return_values[OFFSET_RET(struct arm_scmi_config_get, sensor_config)] = + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + + if (sensor_config == 0xFFFFFFFF) { + return_values[OFFSET_RET(struct arm_scmi_config_get, sensor_config)] = (sensor_update_intervals[sensor_id] << SNR_CFG_UPDATE_INT_SEC_LOW) | (1 << SNR_CFG_UPDATE_INT_EXP_LOW) | (RESERVED << SNR_CFG_SET_RESV_LOW) | (1 << SNR_CFG_SET_TIMESTAMP_REPORTING) | (1 << SNR_CFG_SET_SENSOR_STATE); - *status = SCMI_STATUS_SUCCESS; - *return_values_count = 1; + } + else + return_values[OFFSET_RET(struct arm_scmi_config_get, sensor_config)] = sensor_config; break; case SNSR_CONFIG_SET_MSG_ID: sensor_id = parameters[OFFSET_PARAM(struct arm_scmi_config_set, sensor_id)]; @@ -339,7 +345,7 @@ void sensor_send_message(uint32_t message_id, uint32_t parameter_count, *status = SCMI_STATUS_NOT_FOUND; break; } - sensor_cfg = parameters[OFFSET_PARAM(struct arm_scmi_config_set, sensor_config)]; + sensor_config = parameters[OFFSET_PARAM(struct arm_scmi_config_set, sensor_config)]; *status = SCMI_STATUS_SUCCESS; break; diff --git a/platform/mocker/mocker/transport_voltage.c b/platform/mocker/mocker/transport_voltage.c index a41be07b1a44a7dae34b4a902f0c8217972eb04f..87fca133f33a569b765931489d19ededf5c9447c 100644 --- a/platform/mocker/mocker/transport_voltage.c +++ b/platform/mocker/mocker/transport_voltage.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,21 +25,203 @@ void fill_voltage_protocol() voltage_protocol.protocol_version = VOLTAGE_VERSION; voltage_protocol.number_domains = num_voltage_domains; voltage_protocol.voltage_domain_name = voltage_domain_names; + voltage_protocol.voltage_describe_levels = voltage_describe_levels; + voltage_protocol.operational_level = operational_level; } void voltage_send_message(uint32_t message_id, uint32_t parameter_count, const uint32_t *parameters, int32_t *status, size_t *return_values_count, uint32_t *return_values) { + uint32_t return_idx, parameter_idx, domain_id, total_levels = 4; + uint32_t i; + char *name; switch(message_id) { case VOLTAGE_PROTO_VER_MSG_ID: *status = SCMI_STATUS_SUCCESS; *return_values_count = 1; - return_values[0] = voltage_protocol.protocol_version; + return_idx = OFFSET_RET(struct arm_scmi_voltage_protocol_version, version); + return_values[return_idx] = voltage_protocol.protocol_version; + break; + + case VOLTAGE_PROTO_ATTR_MSG_ID: + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + return_idx = OFFSET_RET(struct arm_scmi_voltage_protocol_attributes, attributes); + return_values[return_idx] = voltage_protocol.number_domains; + break; + + case VOLTAGE_PROTO_MSG_ATTR_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_protocol_message_attributes, + message_id); + if(parameters[parameter_idx] > VOLTAGE_LEVEL_GET_MSG_ID) { + *status = SCMI_STATUS_NOT_FOUND; + } else { + *status = SCMI_STATUS_SUCCESS; + *return_values_count = 1; + return_values[OFFSET_RET( + struct arm_scmi_voltage_protocol_message_attributes, attributes)] = 0x0; + } + break; + + case VOLTAGE_DOMAIN_ATTR_MSG_ID: + if (voltage_protocol.protocol_version == 0x00010000) { + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_domain_attributes, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_voltage_domain_attributes, attributes); + return_values[return_idx] = 0; + sprintf((char *)&return_values[1], "%s", + voltage_protocol.voltage_domain_name[domain_id]); + *return_values_count = strnlen((const char*)return_values, 25) + 1; + break; + } else { + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_domain_attributes_v2, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + *status = SCMI_STATUS_SUCCESS; + name = voltage_protocol.voltage_domain_name[domain_id]; + + if (strnlen(name, 25) > 16) { + return_idx = OFFSET_RET(struct arm_scmi_voltage_domain_attributes_v2, attributes); + return_values[return_idx] = 1 << VOLTAGE_EXTENDED_DOMAIN_NAME_LOW_V2; + sprintf((char *)&return_values[1], "%s", name + strnlen(name, 25) -16); + } else { + return_idx = OFFSET_RET(struct arm_scmi_voltage_domain_attributes_v2, attributes); + return_values[return_idx] = 0; + sprintf((char *)&return_values[1], "%s", name); + } + *return_values_count = strnlen((const char*)return_values, 25) + 1; + break; + } + + case VOLTAGE_DESCRIBE_LEVELS_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_describe_levels, domain_id); + domain_id = parameters[parameter_idx]; + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_describe_levels, level_index); + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + if (parameters[parameter_idx] >= total_levels) { + *status = SCMI_STATUS_OUT_OF_RANGE; + break; + } + + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_voltage_describe_levels, flags); + return_values[return_idx] = total_levels; + for (i = 0; i < total_levels; i++) { + return_idx = OFFSET_RET(struct arm_scmi_voltage_describe_levels, voltage) + i; + return_values[return_idx] = voltage_protocol.voltage_describe_levels[domain_id][i]; + } + *return_values_count = total_levels + 1; + break; + + case VOLTAGE_CONFIG_SET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_config_set, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + *status = SCMI_STATUS_SUCCESS; + break; + + case VOLTAGE_CONFIG_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_config_get, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_voltage_config_get, config); + return_values[return_idx] = 0x7; /* Architecture mode and Voltage Supply on */ + *return_values_count = 1; + break; + + case VOLTAGE_LEVEL_SET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_level_set, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_level_set, flags); + if (parameters[parameter_idx] != 0) { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_level_set, voltage_level); + if ((parameters[parameter_idx] < + voltage_protocol.voltage_describe_levels[domain_id][0]) || + (parameters[parameter_idx] > + voltage_protocol.voltage_describe_levels[domain_id][total_levels-1])) + { + *status = SCMI_STATUS_INVALID_PARAMETERS; + break; + } + + *status = SCMI_STATUS_SUCCESS; + voltage_protocol.operational_level[domain_id] = parameters[parameter_idx]; + break; + + case VOLTAGE_LEVEL_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_level_get, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + *status = SCMI_STATUS_SUCCESS; + return_idx = OFFSET_RET(struct arm_scmi_voltage_level_get, voltage_level); + return_values[return_idx] = voltage_protocol.operational_level[domain_id]; + *return_values_count = 1; + break; + + case VOLTAGE_DOMAIN_NAME_GET_MSG_ID: + parameter_idx = OFFSET_PARAM(struct arm_scmi_voltage_domain_name_get, domain_id); + domain_id = parameters[parameter_idx]; + + if (domain_id >= voltage_protocol.number_domains) { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + name = voltage_protocol.voltage_domain_name[domain_id]; + return_idx = OFFSET_RET(struct arm_scmi_voltage_domain_name_get, flags); + return_values[return_idx] = 0; + if (strnlen(name, 25) > 16) { + *status = SCMI_STATUS_SUCCESS; + sprintf((char *)&return_values[1], "%s", name); + } else { + *status = SCMI_STATUS_NOT_FOUND; + break; + } + + *return_values_count = strnlen((const char*)return_values, 25) + 1; break; - /* Other Message IDs pending implementation */ default: *status = SCMI_STATUS_NOT_FOUND; diff --git a/platform/mocker/pal_clock.c b/platform/mocker/pal_clock.c index 948db320b02855c4527bb00ce11287d5b1f65c43..65cf1fab095de9be6fb7cbb823ab6bc3f43bdf01 100644 --- a/platform/mocker/pal_clock.c +++ b/platform/mocker/pal_clock.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -39,3 +39,8 @@ uint32_t pal_check_clock_config_change_support(uint32_t clock_id) { return 0; } + +uint32_t pal_clock_get_parent_support(uint32_t clock_id) +{ + return clock_parent_support[clock_id]; +} diff --git a/platform/mocker/pal_performance.c b/platform/mocker/pal_performance.c index 50eb03d74a005cc75aa10df9dfb774cffe506fea..cefabca18115b6f615fd788222a99f94c7af0d1b 100644 --- a/platform/mocker/pal_performance.c +++ b/platform/mocker/pal_performance.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -71,6 +71,11 @@ uint32_t pal_performance_get_expected_fast_channel_support(uint32_t domain_id) return perf_domain_fast_ch_support[domain_id]; } +uint32_t pal_performance_get_level_index_mode_support(uint32_t domain_id) +{ + return performance_domain_level_index_mode_support[domain_id]; +} + uint32_t pal_performance_get_expected_rate_limit(uint32_t domain_id) { return performance_rate_limit[domain_id]; @@ -101,6 +106,11 @@ uint32_t pal_performance_get_expected_latency(uint32_t domain_id, uint32_t index return perf_performance_level_worst_latency[domain_id][index]; } +uint32_t pal_performance_get_expected_indicative_frequency(uint32_t domain_id, uint32_t index) +{ + return perf_performance_level_indicative_frequency[domain_id][index]; +} + uint8_t* pal_performance_get_expected_name(uint32_t domain_id) { return (uint8_t*)&performance_domain_names[domain_id][0]; diff --git a/platform/mocker/pal_pin_control.c b/platform/mocker/pal_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..c6849fe4386cceff55cbf38e9bdadddd9514673f --- /dev/null +++ b/platform/mocker/pal_pin_control.c @@ -0,0 +1,115 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include +#include +#include + +/** + @brief This API is used for checking num of pins + @param none + @return num of pins +**/ +uint32_t pal_pin_control_get_expected_num_pins(void) +{ + return num_pins; +} + +/** + @brief This API is used for checking num of groups + @param none + @return num of groups +**/ +uint32_t pal_pin_control_get_expected_num_groups(void) +{ + return num_groups; +} + +/** + @brief This API is used for checking num of functions + @param none + @return num of functions +**/ +uint32_t pal_pin_control_get_expected_num_functions(void) +{ + return num_functions; +} + +/** +@brief This API is used to check if pin or group is accessible for given agent id + 1. Caller - Test Suite. + @param agent_id agent id + @param identifier The identifier of pin or group + @param selector Selector of pin or group + @return status 0 on access +**/ +uint32_t pal_pinctrl_check_access(uint32_t agent_id,uint32_t identifier, uint32_t selector) + +{ + return pinctrl_check_access(agent_id, identifier, selector); +} + +/** + @brief This API is used for checking num of pins in a group + @param identifier of the pin + @return num of pins in a group +**/ +uint32_t pal_pin_control_get_expected_pins_in_group(uint32_t identifier) +{ + return num_pins_in_group[identifier]; +} + +/** + @brief This API is used for checking num of groups associated with the function + @param identifier of the function + @return num of groups in function +**/ +uint32_t pal_pin_control_get_expected_groups_in_func(uint32_t identifier) +{ + return num_groups_in_function[identifier]; +} + +/** + @brief This API is used to get identifier of pin associated with the group + @param identifier of the group + @return pin identifier of group in index +**/ +uint32_t pal_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index) +{ + return group_associations[identifier][index]; +} + +/** + @brief This API is used to get identifier of group associated with the function + @param identifier of the function + @return pin identifier of function in index +**/ +uint32_t pal_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index) +{ + return function_associations[identifier][index]; +} + +/** + @brief This API is used to check if a pin, group or function have extended name support + @param identifier idenfifier of pin, group or function + @param index + @return 1 on support +**/ +uint32_t pal_pin_control_get_extended_name_support(uint32_t identifier, uint32_t index) +{ + return pin_control_extended_name_support[identifier][index]; +} diff --git a/platform/mocker/pal_platform.c b/platform/mocker/pal_platform.c index 5c6f9e51a0aff420b4f4be5a8fa4ee21e6c4eedd..4b0379b2fd360e2df8b86a8d28cb3c64eefe0444 100644 --- a/platform/mocker/pal_platform.c +++ b/platform/mocker/pal_platform.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021-2023, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -92,6 +92,14 @@ void pal_send_message(uint32_t message_header_send, size_t parameter_count, voltage_send_message(message_id, parameter_count, parameters, status, return_values_count, return_values); break; + case POWERCAP_PROTOCOL_ID: + powercap_send_message(message_id, parameter_count, parameters, status, + return_values_count, return_values); + break; + case PIN_CONTROL_PROTOCOL_ID: + pin_control_send_message(message_id, parameter_count, parameters, status, + return_values_count, return_values); + break; default: printf("\nProtocol: %d\n", message_id); assert(!"\nUnknown protocol id\n"); @@ -129,6 +137,8 @@ uint32_t pal_initialize_system(void *info) fill_clock_protocol(); fill_reset_protocol(); fill_voltage_protocol(); + fill_powercap_protocol(); + fill_pin_control_protocol(); return PAL_STATUS_PASS; } diff --git a/platform/mocker/pal_power_domain.c b/platform/mocker/pal_power_domain.c index ff6121595a59f843782ff0a8689d53b16f1ac0ac..2b6b36e0971db2a8ea0351da1822f5f1ec44d066 100644 --- a/platform/mocker/pal_power_domain.c +++ b/platform/mocker/pal_power_domain.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -39,3 +39,13 @@ uint32_t pal_power_get_expected_stats_addr_len(void) { return statistics_address_len_pow; } + +uint32_t pal_power_get_sync_support(uint32_t domain_id) +{ + return power_synchronous_support[domain_id]; +} + +uint32_t pal_power_get_async_support(uint32_t domain_id) +{ + return power_asynchronous_support[domain_id]; +} diff --git a/platform/mocker/pal_powercap.c b/platform/mocker/pal_powercap.c new file mode 100644 index 0000000000000000000000000000000000000000..f70c1f9d9e8aa005d780c98a407bba2fab69cc47 --- /dev/null +++ b/platform/mocker/pal_powercap.c @@ -0,0 +1,159 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include +#include + +/** + @brief This API is used for checking num of powercap domain + @param none + @return num of powercap domain +**/ +uint32_t pal_powercap_get_expected_num_domains(void) +{ + return num_powercap_domain; +} + +/** + @brief This API is used for checking powercap domain name + @param domain id + @return powercap domain name +**/ +uint8_t *pal_powercap_get_expected_name(uint32_t domain_id) +{ + return (uint8_t *)powercap_domain_name[domain_id]; +} + +/** + @brief This API is used for checking powercap min pai + @param domain id + @return min pai +**/ +uint32_t pal_powercap_get_min_pai(uint32_t domain_id) +{ + return min_pai[domain_id]; +} + +/** + @brief This API is used for checking powercap max_pai + @param domain id + @return max pai +**/ +uint32_t pal_powercap_get_max_pai(uint32_t domain_id) +{ + return max_pai[domain_id]; +} + +/** + @brief This API is used for checking powercap pai step + @param domain id + @return pai step +**/ +uint32_t pal_powercap_get_pai_step(uint32_t domain_id) +{ + return pai_step[domain_id]; +} + +/** + @brief This API is used for checking powercap min_power_cap + @param domain id + @return min_power_cap +**/ +uint32_t pal_powercap_get_min_power_cap(uint32_t domain_id) +{ + return min_power_cap[domain_id]; +} + +/** + @brief This API is used for checking powercap max_power_cap + @param domain id + @return max_power_cap +**/ +uint32_t pal_powercap_get_max_power_cap(uint32_t domain_id) +{ + return max_power_cap[domain_id]; +} + +/** + @brief This API is used for checking powercap power_cap_step + @param domain id + @return power_cap_step +**/ +uint32_t pal_powercap_get_power_cap_step(uint32_t domain_id) +{ + return power_cap_step[domain_id]; +} + +/** + @brief This API is used for checking powercap sustainable power + @param domain id + @return sustainable power +**/ +uint32_t pal_powercap_get_sustainable_power(uint32_t domain_id) +{ + return sustainable_power[domain_id]; +} + +/** + @brief This API is used for checking powercap accuracy + @param domain id + @return accuracy +**/ +uint32_t pal_powercap_get_accuracy(uint32_t domain_id) +{ + return accuracy[domain_id]; +} + +/** + @brief This API is used for checking powercap pai + @param domain id + @return pai +**/ +uint32_t pal_powercap_get_pai(uint32_t domain_id) +{ + return pai[domain_id]; +} + +/** + @brief This API is used for checking powercap power_cap + @param domain id + @return power_cap +**/ +uint32_t pal_powercap_get_power_cap(uint32_t domain_id) +{ + return power_cap[domain_id]; +} + +/** + @brief This API is used for checking powercap avg_power + @param domain id + @return avg_power +**/ +uint32_t pal_powercap_get_avg_power(uint32_t domain_id) +{ + return avg_power[domain_id]; +} + +/** + @brief This API is used for checking extended name support + @param domain id + @return 1 on support +**/ +uint32_t pal_powercap_get_extended_name_support(uint32_t domain_id) +{ + return powercap_extended_name_support[domain_id]; +} diff --git a/platform/mocker/pal_voltage.c b/platform/mocker/pal_voltage.c index 38c43ce68fde4898fe6470ccc5ec720583f7699c..90aa755540b431e34d23e3cd547fc8065e27f2ff 100644 --- a/platform/mocker/pal_voltage.c +++ b/platform/mocker/pal_voltage.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,3 +37,26 @@ uint8_t *pal_voltage_get_expected_name(uint32_t domain_id) { return (uint8_t *)voltage_domain_names[domain_id]; } + +/** + @brief This API is used for getting voltage describe levels + @param domain id + @param index + @return voltage describe level +**/ + +uint32_t pal_voltage_get_describe_levels(uint32_t domain_id, uint32_t index) +{ + return voltage_describe_levels[domain_id][index]; +} + +/** + @brief This API is used for getting voltage operational level + @param domain id + @return voltage operational level +**/ + +uint32_t pal_voltage_operational_level(uint32_t domain_id) +{ + return operational_level[domain_id]; +} diff --git a/test_pool/clock/test_c003_v2p1.c b/test_pool/clock/test_c003_v2p1.c new file mode 100644 index 0000000000000000000000000000000000000000..7b212a7c1eb913d6efd905b0257104f14fe3f307 --- /dev/null +++ b/test_pool/clock/test_c003_v2p1.c @@ -0,0 +1,172 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 3) +#define TEST_DESC "Clock msg attributes mandatory cmd check " + +uint32_t clock_query_mandatory_command_support_v2p1(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Mandatory cmd CLOCK ATTRIBUTES should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] CLOCK ATTRIBUTES support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_ATTRIBUTES; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Mandatory cmd CLOCK DESCRIBE RATES should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 2] CLOCK DESCRIBE RATES support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_DESCRIBE_RATES; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Mandatory cmd CLOCK RATE SET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 3] CLOCK RATE SET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_RATE_SET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Mandatory cmd CLOCK RATE GET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 4] CLOCK RATE GET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_RATE_GET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Mandatory cmd CLOCK CONFIG SET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 5] CLOCK CONFIG SET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_CONFIG_SET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Mandatory cmd CLOCK CONFIG GET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 6] CLOCK CONFIG GET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_CONFIG_GET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c005_v2.c b/test_pool/clock/test_c005_v2.c new file mode 100644 index 0000000000000000000000000000000000000000..bc0fc8aca90f6950060871c1a0fb4832ee6da7df --- /dev/null +++ b/test_pool/clock/test_c005_v2.c @@ -0,0 +1,88 @@ +/** @file + * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 5) +#define TEST_DESC "Clock attributes check " + +uint32_t clock_attributes_check_v2(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id, num_clocks, attributes; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Discover clock attributes for all clocks */ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM CLOCKS : %d", num_clocks); + + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK ID: %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query clock attribute"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 1, 28) != + VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + val_clock_save_info(CLOCK_ATTRIBUTE, clock_id, attributes); + + val_print(VAL_PRINT_INFO, "\n CLOCK_ENABLED: %d", + val_get_clock_attributes_flag(attributes, CLOCK_ENABLE)); + val_print(VAL_PRINT_INFO, "\n Extended Name Support: %d", + val_get_clock_attributes_flag(attributes, CLOCK_EXTENDED_NAME_SUPPORT)); + val_print(VAL_PRINT_INFO, "\n Rate Change req notify Support: %d", + val_get_clock_attributes_flag(attributes, CLOCK_RATE_CHNG_REQ_NOTI_SUPP)); + val_print(VAL_PRINT_INFO, "\n Rate Change notification Support: %d", + val_get_clock_attributes_flag(attributes, CLOCK_RATE_CHNG_NOTI_SUPP)); + + val_print(VAL_PRINT_INFO, "\n CLOCK_NAME: %s ", + (uint8_t *) &return_values[NAME_OFFSET]); + val_print(VAL_PRINT_INFO, "\n CLOCK Enable Delay: %d ", + return_values[ENABLE_DELAY_OFFSET]); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c005_v2p1.c b/test_pool/clock/test_c005_v2p1.c new file mode 100644 index 0000000000000000000000000000000000000000..3cb770fc1b51ea5b9276a47a743e15579f139e57 --- /dev/null +++ b/test_pool/clock/test_c005_v2p1.c @@ -0,0 +1,89 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 5) +#define TEST_DESC "Clock attributes check " + +uint32_t clock_attributes_check_v2p1(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id, num_clocks, attributes; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Discover clock attributes for all clocks */ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM CLOCKS : %d", num_clocks); + + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK ID: %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query clock attribute"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 1, 27) != + VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + val_clock_save_info(CLOCK_ATTRIBUTE, clock_id, attributes); + + val_print(VAL_PRINT_INFO, "\n CLOCK_ENABLED: %d", + val_get_clock_attributes_flag(attributes, CLOCK_ENABLE)); + val_print(VAL_PRINT_INFO, "\n Extended Name Support: %d", + val_get_clock_attributes_flag(attributes, CLOCK_EXTENDED_NAME_SUPPORT)); + val_print(VAL_PRINT_INFO, "\n Rate Change req notify Support: %d", + val_get_clock_attributes_flag(attributes, CLOCK_RATE_CHNG_REQ_NOTI_SUPP)); + val_print(VAL_PRINT_INFO, "\n Rate Change notification Support: %d", + val_get_clock_attributes_flag(attributes, CLOCK_RATE_CHNG_NOTI_SUPP)); + val_print(VAL_PRINT_INFO, "\n Parent Clock Identifier Support: %d", + val_get_clock_attributes_flag(attributes, CLOCK_PARENT_IDENTIFIER_SUPPORT)); + val_print(VAL_PRINT_INFO, "\n CLOCK_NAME: %s ", + (uint8_t *) &return_values[NAME_OFFSET]); + val_print(VAL_PRINT_INFO, "\n CLOCK Enable Delay: %d ", + return_values[ENABLE_DELAY_OFFSET]); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c007.c b/test_pool/clock/test_c007.c index fa0866b5a30435d3b9b554aadcb6d4f5c5d91d95..774c09ed6b5b3a829d12e69c1e4849046e36d0e0 100644 --- a/test_pool/clock/test_c007.c +++ b/test_pool/clock/test_c007.c @@ -100,7 +100,8 @@ uint32_t clock_query_describe_rates(void) if (return_format == CLOCK_RATE_FMT_ARRAY) { for (i = 0; i < num_rates_retured; i++) { - val_print(VAL_PRINT_DEBUG, "\n Rate Index : %d", rate_index + i); + val_print(VAL_PRINT_DEBUG, "\n Rate Index : %d", + rate_index + i); lower_word = rate_array[i * 2]; upper_word = rate_array[1 + i * 2]; diff --git a/test_pool/clock/test_c017_v2p1.c b/test_pool/clock/test_c017_v2p1.c new file mode 100644 index 0000000000000000000000000000000000000000..4332eb4eb3cc28c8ca8baced126bd049b89b1a37 --- /dev/null +++ b/test_pool/clock/test_c017_v2p1.c @@ -0,0 +1,146 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 17) +#define TEST_DESC "Clock config set check " + +#define MAX_PARAMETER_SIZE 3 + +/********* TEST ALGO ******************** + * Find a new attribute from previously saved value + * Set new attribute + * Get the attribute again and compare with newly set attribute + * Restore the default attribute +*****************************************/ + +uint32_t clock_config_set_check_v2p1(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE], attributes; + uint32_t clock_id, num_clocks, parameters[MAX_PARAMETER_SIZE]; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM CLOCKS : %d", num_clocks); + + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + bool could_be_denied = false; + + val_print(VAL_PRINT_TEST, "\n CLOCK ID: %d", clock_id); + + if (val_check_clock_config_change_support(clock_id) == 1) + could_be_denied = true; + + run_flag = 1; + /* Find new attribute from previously stored value */ + attributes = val_clock_get_info(CLOCK_ATTRIBUTE, clock_id) & 0x1; + if (attributes == CONFIG_SET_DISABLE) + attributes = CONFIG_SET_ENABLE; + else + attributes = CONFIG_SET_DISABLE; + + /* CLOCK_CONFIG_SET with new attribute */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Set config with attributes :%d", attributes); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = attributes; + parameters[param_count++] = 0; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (could_be_denied && + val_compare_status(status, SCMI_DENIED) == VAL_STATUS_PASS) + return VAL_STATUS_PASS; + + if (val_compare_status(status, SCMI_NOT_SUPPORTED) == VAL_STATUS_PASS) + continue; + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Get attribute and compare with new value */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Verify the changed attribute"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[ATTRIBUTE_OFFSET], 1, 27) != VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_compare("CLOCK STATUS ", + VAL_EXTRACT_BITS(return_values[ATTRIBUTE_OFFSET], 0, 0), attributes)) + return VAL_STATUS_FAIL; + + /* Restore the default attribute value*/ + val_print(VAL_PRINT_TEST, "\n [Check 3] Restore the original attributes :%d", + val_clock_get_info(CLOCK_ATTRIBUTE, clock_id)); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = val_clock_get_info(CLOCK_ATTRIBUTE, clock_id); + parameters[param_count++] = 0; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + if (run_flag == 0) + return VAL_STATUS_SKIP; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c018.c b/test_pool/clock/test_c018.c new file mode 100644 index 0000000000000000000000000000000000000000..56f62fa62753360fcc50c654b2ca4b4972201fe9 --- /dev/null +++ b/test_pool/clock/test_c018.c @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 18) +#define TEST_DESC "Clock domain ext name get check " + +uint32_t clock_query_ext_domain_name(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id, num_clocks; + uint8_t *extended_name; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + /* Check Clock for valid domain */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK ID : %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query extended domain name"); + + /* Check if extended domain name is supported for this clock */ + extended_name_supp = val_get_clock_attribute(clock_id, CLOCK_EXTENDED_NAME_SUPPORT); + if (extended_name_supp != CLOCK_EXTENDED_DOMAIN_NAME) + { + val_print(VAL_PRINT_ERR, "\n Clock doesn't support extended name"); + continue; + } + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + extended_name = (uint8_t *) &return_values[CLOCK_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Clock ext name : %s", extended_name); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c019.c b/test_pool/clock/test_c019.c new file mode 100644 index 0000000000000000000000000000000000000000..598ecb43303c5eb4ad70141d6d2e6e38bc4ec1a5 --- /dev/null +++ b/test_pool/clock/test_c019.c @@ -0,0 +1,99 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 19) +#define TEST_DESC "Clock get ext name for invalid domain " + +uint32_t clock_query_domain_ext_name_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id, num_clocks; + uint32_t extended_name_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get Extended name for invalid clock */ + clock_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no clocks found */ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + /* Check Clocks for unsupported ext name */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_get_clock_attribute(clock_id, CLOCK_EXTENDED_NAME_SUPPORT); + + if (extended_name_supp == CLOCK_EXTENDED_DOMAIN_NAME) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n Clock DOMAIN : %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c020.c b/test_pool/clock/test_c020.c new file mode 100644 index 0000000000000000000000000000000000000000..d195dc1a1a912ac36039927e04de6c767e0eb5eb --- /dev/null +++ b/test_pool/clock/test_c020.c @@ -0,0 +1,106 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define PARAMETER_SIZE 2 + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 20) +#define TEST_DESC "Clock Rate changed notification cmd check " + +uint32_t clock_rate_notification_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t clock_id, num_clocks; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if CLOCK_RATE_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] CLOCK_RATE_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_RATE_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n CLOCK_RATE_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + /* Skip if no domains found*/ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found"); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK : %d", clock_id); + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query Rate Change Notification Support"); + if (val_get_clock_attribute(num_clocks, CLOCK_RATE_CHNG_NOTI_SUPP) == + CLOCK_NOTIFY_NOT_SUPP) { + val_print(VAL_PRINT_ERR, "\n Clock doesn't support Rate notify"); + continue; + } + + run_flag = 1; + + val_print(VAL_PRINT_TEST, "\n [Check 3] Query Clock Rate Notify"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = clock_id; + parameters[param_count++] = CLOCK_NOTIFY_NOT_SUPP; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_RATE_NOTIFY, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock support Rate change Notify"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c021.c b/test_pool/clock/test_c021.c new file mode 100644 index 0000000000000000000000000000000000000000..d02660c879c8e17367f9caf7f4bd1548294ed869 --- /dev/null +++ b/test_pool/clock/test_c021.c @@ -0,0 +1,81 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define PARAMETER_SIZE 2 + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 21) +#define TEST_DESC "Clock Rate changed notification invalid cmd check " + +uint32_t clock_rate_notification_invalid_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t clock_id; + uint32_t parameters[PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if CLOCK_RATE_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] CLOCK_RATE_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_RATE_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n CLOCK_RATE_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + /* query clock rate notification for invalid domain ID*/ + clock_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query Clock rate Notify for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = clock_id; + parameters[param_count++] = CLOCK_NOTIFY_NOT_SUPP; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_RATE_NOTIFY, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c022.c b/test_pool/clock/test_c022.c new file mode 100644 index 0000000000000000000000000000000000000000..821e7189011a0f3958c4ea6bed7e14be41a41c79 --- /dev/null +++ b/test_pool/clock/test_c022.c @@ -0,0 +1,104 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define PARAMETER_SIZE 2 + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 22) +#define TEST_DESC "Clock Rate chang reqnotification cmd check " + +uint32_t clock_rate_req_notification_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t clock_id, num_clocks; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if CLOCK_RATE_CHANGE_REQUESTED_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] CLOCK_RATE_CHANGE_REQUESTED_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_RATE_CHANGE_REQUESTED_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n CLOCK_RATE_CHANGE_REQUESTED_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + /* Skip if no domains found*/ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found"); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK : %d", clock_id); + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query Rate Change Notification Support"); + if (val_get_clock_attribute(clock_id, CLOCK_RATE_CHNG_REQ_NOTI_SUPP) == CLOCK_NOTIFY_SUPP) { + val_print(VAL_PRINT_ERR, "\n Clock doesn't support Rate notify"); + continue; + } + run_flag = 1; + + val_print(VAL_PRINT_TEST, "\n [Check 3] Query Clock Rate req Notify"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = clock_id; + parameters[param_count++] = CLOCK_NOTIFY_NOT_SUPP; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_RATE_CHANGE_REQUESTED_NOTIFY, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock support Rate change req Notify"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c023.c b/test_pool/clock/test_c023.c new file mode 100644 index 0000000000000000000000000000000000000000..ff0f1283d2f868e31b1ac194c771a8568d080a35 --- /dev/null +++ b/test_pool/clock/test_c023.c @@ -0,0 +1,82 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define PARAMETER_SIZE 2 + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 23) +#define TEST_DESC "Clock Rate chang req notification invalid cmd check " + +uint32_t clock_rate_req_notification_invalid_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t clock_id; + uint32_t parameters[PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if CLOCK_RATE_CHANGE_REQUESTED_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] CLOCK_RATE_CHANGE_REQUESTED_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = CLOCK_RATE_CHANGE_REQUESTED_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n CLOCK_RATE_CHANGE_REQUESTED_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + /* query clock rate req notification for invalid domain ID*/ + clock_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query Clock rate req Notify for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = clock_id; + parameters[param_count++] = CLOCK_NOTIFY_NOT_SUPP; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_RATE_CHANGE_REQUESTED_NOTIFY, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c024.c b/test_pool/clock/test_c024.c new file mode 100644 index 0000000000000000000000000000000000000000..665529e1f22f50a1b6a82360ee043164174eb213 --- /dev/null +++ b/test_pool/clock/test_c024.c @@ -0,0 +1,99 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 24) +#define TEST_DESC "Clock parent get invalid clock id check " + +uint32_t clock_parent_get_invalid_clock_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id, num_clocks; + uint32_t parent_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get parent name for invalid clock */ + clock_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid clock_id "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no clocks found */ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + /* Check Clocks for unsupported parent name */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + /* Check if parent name is supported for this domain */ + parent_supp = val_get_clock_attribute(clock_id, CLOCK_PARENT_IDENTIFIER_SUPPORT); + + if (parent_supp == CLOCK_PARENT_SUPP) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n Clock DOMAIN : %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get parent id for unsupp. clock id"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_SUPPORTED) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support parent Identifier"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c025.c b/test_pool/clock/test_c025.c new file mode 100644 index 0000000000000000000000000000000000000000..7d37e913d707f868198314c985d3f507324d792c --- /dev/null +++ b/test_pool/clock/test_c025.c @@ -0,0 +1,86 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 25) +#define TEST_DESC "Clock config get check " + + +#define MAX_PARAMETER_SIZE 2 + +uint32_t clock_config_get_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE], flags = 0; + uint32_t clock_id, num_clocks, parameters[MAX_PARAMETER_SIZE]; + uint32_t attributes, clock_config, oem_config_val; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + /* Skip if no clocks found */ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM CLOCKS : %d", num_clocks); + + /* Get Clock Config value for each clock */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK ID: %d", clock_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = flags; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 0, 31) != VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + clock_config = return_values[CLOCK_CONFIG_OFFSET]; + + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(clock_config, 1, 31) != + VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_DEBUG, "\n CLOCK State : %d", + VAL_EXTRACT_BITS(clock_config, 0, 0)); + + oem_config_val = return_values[CLOCK_CONFIG_OEM_VAL_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n OEM Config Value : %d", oem_config_val); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c026.c b/test_pool/clock/test_c026.c new file mode 100644 index 0000000000000000000000000000000000000000..3086f8f72c3cb3e6db587b425eb6e361a1e3fdf0 --- /dev/null +++ b/test_pool/clock/test_c026.c @@ -0,0 +1,86 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 26) +#define TEST_DESC "Clock parent name support get check " + +uint32_t clock_parent_name_support_get_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id, num_clocks; + uint32_t parent_id; + uint32_t parent_id_supp; + uint32_t flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + /* Check Clock for valid parent ID */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK ID : %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query Parent Name Support"); + + /* Check if parent name is supported for this clock */ + parent_id_supp = val_get_clock_attribute(clock_id, CLOCK_PARENT_IDENTIFIER_SUPPORT); + if (parent_id_supp != CLOCK_PARENT_SUPP) + { + val_print(VAL_PRINT_ERR, "\n Clock doesn't support Parent Identifier"); + continue; + } + flag = 1; + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + parent_id = return_values[CLOCK_PARENT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Clock parent name : %d", parent_id); + } + + if (flag == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock support parent name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c027.c b/test_pool/clock/test_c027.c new file mode 100644 index 0000000000000000000000000000000000000000..e9c61593daca9cfea696f591278a5985b9c7ef4e --- /dev/null +++ b/test_pool/clock/test_c027.c @@ -0,0 +1,167 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 27) +#define TEST_DESC "Clock parent name support set check " + +#define MAX_PARAMETER_SIZE 2 + + +/************ TEST ALGO ****************** + * Get current parent Id. + * Choose a new parent Id. + * Set new parent ID for current clock. + * Check new parent Id has been set. + * Restore the default parent Id. +*****************************************/ + +uint32_t clock_parent_name_support_set_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[MAX_PARAMETER_SIZE]; + uint32_t clock_id, num_clocks; + uint32_t parent_id; + uint32_t default_parent_id, new_parent_id; + uint32_t parent_id_supp; + uint32_t flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + /* Check Clock for valid parent ID */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + val_print(VAL_PRINT_TEST, "\n CLOCK ID : %d", clock_id); + /* Check if parent name is supported for this clock */ + parent_id_supp = val_get_clock_attribute(clock_id, CLOCK_PARENT_IDENTIFIER_SUPPORT); + if (parent_id_supp != CLOCK_PARENT_SUPP) + { + val_print(VAL_PRINT_ERR, "\n Clock doesn't support Parent Identifier"); + continue; + } + + flag = 1; + /*Step:1 Get the parent Id of the current clock */ + val_print(VAL_PRINT_TEST, "\n [STEP 1] Get Parent ID"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + parent_id = return_values[CLOCK_PARENT_NAME_OFFSET]; + default_parent_id = parent_id; + val_print(VAL_PRINT_DEBUG, "\n Default Clock parent Id : %d", default_parent_id); + + new_parent_id = val_clock_get_possible_parents(clock_id, CLOCK_PARENT_START_OFFSET); + if (new_parent_id == parent_id && (val_clock_get_num_possible_parents(clock_id) > 1)) + new_parent_id = val_clock_get_possible_parents(clock_id, + CLOCK_PARENT_START_OFFSET + 1); + + /*Step:2 Set new parent ID for current clock*/ + val_print(VAL_PRINT_TEST, "\n [STEP 2] Set new Parent ID"); + val_print(VAL_PRINT_DEBUG, "\n New Clock parent Id : %d", new_parent_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = new_parent_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /*Step:3 Verify new Parent Id has been Set*/ + val_print(VAL_PRINT_TEST, "\n [STEP 3] Verify New Parent ID"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + parent_id = return_values[CLOCK_PARENT_NAME_OFFSET]; + if (val_compare("New Parent Id ", parent_id, new_parent_id)) + return VAL_STATUS_FAIL; + + /* STEP:4 : Set default parent Id back */ + val_print(VAL_PRINT_TEST, "\n [STEP 4] Set default Parent ID"); + val_print(VAL_PRINT_DEBUG, "\n New Clock parent Id : %d", new_parent_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = default_parent_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + if (flag == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock support parent name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} + + + + + + + + + diff --git a/test_pool/clock/test_c028.c b/test_pool/clock/test_c028.c new file mode 100644 index 0000000000000000000000000000000000000000..9fa779064b19f3a992a2b7b8909a6b3aa2456235 --- /dev/null +++ b/test_pool/clock/test_c028.c @@ -0,0 +1,114 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 28) +#define TEST_DESC "Clock parent set invalid check " + +#define MAX_PARAMETER_SIZE 2 + +uint32_t clock_parent_set_invalid_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[MAX_PARAMETER_SIZE]; + uint32_t clock_id, num_clocks; + uint32_t parent_supp, parent_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no clocks found */ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + /* Set Invalid parent ID */ + clock_id = 0; + parent_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid parent_id "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + /* Invalid Parent Id Clock - Clock id greater than max no of clocks */ + parameters[param_count++] = parent_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Check Clocks for unsupported parent name */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + /* Check if parent name is supported for this domain */ + parent_supp = val_get_clock_attribute(clock_id, CLOCK_PARENT_IDENTIFIER_SUPPORT); + + if (parent_supp == CLOCK_PARENT_SUPP) { + parent_id = clock_id; + val_print(VAL_PRINT_TEST, "\n [Check 2] Query with same parent_id and clock_id "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = parent_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + continue; + } + + parent_id = (clock_id + 1) % num_clocks; + val_print(VAL_PRINT_TEST, "\n Clock DOMAIN : %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 3] Set parent id for unsupp. clock id"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = parent_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_SUPPORTED) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c029.c b/test_pool/clock/test_c029.c new file mode 100644 index 0000000000000000000000000000000000000000..8681d210b9753092e2983ebe5fcba221a3515d64 --- /dev/null +++ b/test_pool/clock/test_c029.c @@ -0,0 +1,60 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 29) +#define TEST_DESC "Clock parent set invalid clock id check " + +#define MAX_PARAMETER_SIZE 2 + +uint32_t clock_parent_set_invalid_clock_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[MAX_PARAMETER_SIZE]; + uint32_t clock_id; + uint32_t parent_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get parent name for invalid clock */ + clock_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid clock_id "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + /* Invalid Clock Id Clock - Clock id greater than max no of clocks */ + parameters[param_count++] = clock_id; + parameters[param_count++] = parent_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_PARENT_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c030.c b/test_pool/clock/test_c030.c new file mode 100644 index 0000000000000000000000000000000000000000..558685874f4c563ed2dab6e9cf1490e990fde5d7 --- /dev/null +++ b/test_pool/clock/test_c030.c @@ -0,0 +1,57 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 30) +#define TEST_DESC "Clock config get invalid clock id check " + +#define MAX_PARAMETER_SIZE 2 + +uint32_t clock_config_get_invalid_clock_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id, parameters[MAX_PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* clock config get for invalid clock id should return NOT_FOUND status */ + clock_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid clock_id :%d", clock_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + parameters[param_count++] = 0; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c031.c b/test_pool/clock/test_c031.c new file mode 100644 index 0000000000000000000000000000000000000000..5c8f55f117f66f50fa930d44205a9baafbc01b43 --- /dev/null +++ b/test_pool/clock/test_c031.c @@ -0,0 +1,125 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 31) +#define TEST_DESC "Clock possible parents get check " + +#define MAX_PARAMETER_SIZE 2 + +uint32_t clock_possible_parents_get_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[MAX_PARAMETER_SIZE]; + uint32_t clock_id, num_clocks; + uint32_t parent_id_supp; + uint32_t skip_parents = 0; + uint32_t num_remaining_ids, num_ids_returned; + uint32_t i, selector_id, *parents_ids_array, parent_index; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_clocks = val_clock_get_info(NUM_CLOCKS, 0); + if (num_clocks == 0) { + val_print(VAL_PRINT_ERR, "\n No Clocks found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM Clocks : %d", num_clocks); + + /* Check Clock for valid possible parent ID */ + for (clock_id = 0; clock_id < num_clocks; clock_id++) + { + skip_parents = 0; + num_remaining_ids = 0; + num_ids_returned = 0; + parent_index = 0; + + val_print(VAL_PRINT_TEST, "\n CLOCK ID : %d", clock_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query Parent Name Support"); + + /* Check if parent name is supported for this clock */ + parent_id_supp = val_get_clock_attribute(clock_id, CLOCK_PARENT_IDENTIFIER_SUPPORT); + if (parent_id_supp != CLOCK_PARENT_SUPP) + { + val_print(VAL_PRINT_ERR, "\n Clock doesn't support Parent Identifier"); + continue; + } + run_flag = 1; + + do { + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = clock_id; + skip_parents += num_ids_returned; + parameters[param_count++] = skip_parents; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_POSSIBLE_PARENTS_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + num_remaining_ids = VAL_EXTRACT_BITS(return_values + [CLOCK_PARENTS_FLAGS_OFFSET], 24, 31); + + val_print(VAL_PRINT_DEBUG, "\n NUM OF REMAINING PARENT IDS: %d", + num_remaining_ids); + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(return_values + [CLOCK_PARENTS_FLAGS_OFFSET], 8, 23)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_ids_returned = VAL_EXTRACT_BITS(return_values[CLOCK_PARENTS_FLAGS_OFFSET], 0, 7); + val_print(VAL_PRINT_DEBUG, "\n NUM OF CLOCK PARENTS RETURNED : %d", + num_ids_returned); + + parents_ids_array = &return_values[CLOCK_PARENTS_ARRAY_OFFSET]; + /* Print the parent id's associated with the clock */ + for (i = 0; i < num_ids_returned; i++) + { + selector_id = parents_ids_array[i]; + val_print(VAL_PRINT_DEBUG, "\n PARENT ID[%d] : %d", + i, selector_id); + val_clock_save_possible_parents(clock_id, parent_index, selector_id); + parent_index++; + } + val_print(VAL_PRINT_DEBUG, "\n num_remaining_ids: %d", num_remaining_ids); + + } while (num_remaining_ids > 0); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No Clock support parent name"); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/clock/test_c032.c b/test_pool/clock/test_c032.c new file mode 100644 index 0000000000000000000000000000000000000000..ba87b7749b33a109b3483600f35d1dc87a32a864 --- /dev/null +++ b/test_pool/clock/test_c032.c @@ -0,0 +1,54 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_clock.h" + +#define TEST_NUM (SCMI_CLOCK_TEST_NUM_BASE + 32) +#define TEST_DESC "Clock possible parents get invalid id check " + +uint32_t clock_possible_parents_get_invalid_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t clock_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* clock possible parents get for invalid clock id should return NOT_FOUND status */ + clock_id = val_clock_get_info(NUM_CLOCKS, 0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid clock_id :%d", clock_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_CLOCK, CLOCK_POSSIBLE_PARENTS_GET, COMMAND_MSG); + param_count++; + val_send_message(cmd_msg_hdr, param_count, &clock_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d005_v3.c b/test_pool/performance/test_d005_v3.c new file mode 100644 index 0000000000000000000000000000000000000000..50e895df31d76e2698b82be701a425c4b10232f9 --- /dev/null +++ b/test_pool/performance/test_d005_v3.c @@ -0,0 +1,116 @@ +/** @file + * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 5) +#define TEST_DESC "Performance domain attributes check " + +uint32_t performance_query_domain_attributes_v3(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, attribute; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check performance domain attributes for valid domain */ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n PERFORMANCE DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_DOMAIN_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attribute = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attribute, 0, 26)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_INFO, "\n SET LIMIT SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 31, 31)); + val_performance_save_info(PERF_DOMAIN_SET_PERFORMANCE_LIMIT_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 31, 31)); + + val_print(VAL_PRINT_INFO, "\n SET LEVEL SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 30, 30)); + val_performance_save_info(PERF_DOMAIN_SET_PERFORMANCE_LEVEL_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 30, 30)); + + val_print(VAL_PRINT_INFO, "\n LIMIT CHANGE NOTIFY SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 29, 29)); + val_performance_save_info(PERF_DOMAIN_LIMIT_CHANGE_NTFY_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 29, 29)); + + val_print(VAL_PRINT_INFO, "\n LEVEL CHANGE NOTIFY SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 28, 28)); + val_performance_save_info(PERF_DOMAIN_LVL_CHANGE_NTFY_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 28, 28)); + + val_print(VAL_PRINT_INFO, "\n FAST CHANNEL SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 27, 27)); + val_performance_save_info(PERF_DOMAIN_FAST_CH_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 27, 27)); + + val_print(VAL_PRINT_INFO, "\n EXTENDED DOMAIN NAME SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 26, 26)); + val_performance_save_info(PERF_DOMAIN_EXT_NAME_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 26, 26)); + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[RATE_LIMIT_OFFSET], 20, 31)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_INFO, "\n RATE LIMIT : %u", + VAL_EXTRACT_BITS(return_values[RATE_LIMIT_OFFSET], 0, 19)); + val_print(VAL_PRINT_INFO, "\n SUSTAINED FREQENCY : %u", + return_values[FREQUENCY_OFFSET]); + val_print(VAL_PRINT_INFO, "\n SUSTAINED LEVEL : %u", + return_values[SUSTAINED_LEVEL_OFFSET]); + + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + (char *)val_performance_get_expected_name(domain_id), SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d005_v4.c b/test_pool/performance/test_d005_v4.c new file mode 100644 index 0000000000000000000000000000000000000000..7109977c978b31cdda6975e352e34ef715ed7d04 --- /dev/null +++ b/test_pool/performance/test_d005_v4.c @@ -0,0 +1,121 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 5) +#define TEST_DESC "Performance domain attributes check " + +uint32_t performance_query_domain_attributes_v4(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, attribute; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check performance domain attributes for valid domain */ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n PERFORMANCE DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_DOMAIN_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attribute = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attribute, 0, 24)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_INFO, "\n SET LIMIT SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 31, 31)); + val_performance_save_info(PERF_DOMAIN_SET_PERFORMANCE_LIMIT_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 31, 31)); + + val_print(VAL_PRINT_INFO, "\n SET LEVEL SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 30, 30)); + val_performance_save_info(PERF_DOMAIN_SET_PERFORMANCE_LEVEL_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 30, 30)); + + val_print(VAL_PRINT_INFO, "\n LIMIT CHANGE NOTIFY SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 29, 29)); + val_performance_save_info(PERF_DOMAIN_LIMIT_CHANGE_NTFY_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 29, 29)); + + val_print(VAL_PRINT_INFO, "\n LEVEL CHANGE NOTIFY SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 28, 28)); + val_performance_save_info(PERF_DOMAIN_LVL_CHANGE_NTFY_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 28, 28)); + + val_print(VAL_PRINT_INFO, "\n FAST CHANNEL SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 27, 27)); + val_performance_save_info(PERF_DOMAIN_FAST_CH_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 27, 27)); + + val_print(VAL_PRINT_INFO, "\n EXTENDED DOMAIN NAME SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 26, 26)); + val_performance_save_info(PERF_DOMAIN_EXT_NAME_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 26, 26)); + + val_print(VAL_PRINT_INFO, "\n LEVEL INDEX MODE SUPPORT : %d", + VAL_EXTRACT_BITS(attribute, 25, 25)); + val_performance_save_info(PERF_DOMAIN_LVL_INDEX_MODE_SUPPORT, domain_id, + VAL_EXTRACT_BITS(attribute, 25, 25)); + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[RATE_LIMIT_OFFSET], 20, 31)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_INFO, "\n RATE LIMIT : %u", + VAL_EXTRACT_BITS(return_values[RATE_LIMIT_OFFSET], 0, 19)); + val_print(VAL_PRINT_INFO, "\n SUSTAINED FREQENCY : %u", + return_values[FREQUENCY_OFFSET]); + val_print(VAL_PRINT_INFO, "\n SUSTAINED LEVEL : %u", + return_values[SUSTAINED_LEVEL_OFFSET]); + + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + (char *)val_performance_get_expected_name(domain_id), SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d007_v4.c b/test_pool/performance/test_d007_v4.c new file mode 100644 index 0000000000000000000000000000000000000000..78667c0cf4d5c3386459af01cdf44227fb6e8294 --- /dev/null +++ b/test_pool/performance/test_d007_v4.c @@ -0,0 +1,182 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 7) +#define TEST_DESC "Performance describe levels check " + +#define PARAMETER_SIZE 2 +#define PERF_LEVEL_ARRAY_COUNT 5 + +uint32_t performance_query_describe_levels_v4(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, num_remaining_levels, num_levels_retured; + uint32_t i, perf_level, power_cost, latency, level_index, interm_level; + uint32_t min_perf_level, max_perf_level; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t *perf_level_array; + uint32_t indicative_freq, skip_index;; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check performance describe levels for valid domain */ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + skip_index = 0; + num_remaining_levels = 0; + num_levels_retured = 0; + min_perf_level = 0xFFFFFFFF; + max_perf_level = 0; + + val_print(VAL_PRINT_TEST, "\n PERFORMANCE DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query describe levels"); + + do + { + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + skip_index += num_levels_retured; + parameters[param_count++] = skip_index; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_DESCRIBE_LEVELS, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + num_remaining_levels = VAL_EXTRACT_BITS(return_values[NUM_LEVEL_OFFSET], 16, 31); + val_print(VAL_PRINT_DEBUG, "\n NUM OF REMAINING LEVELS: %d", + num_remaining_levels); + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[NUM_LEVEL_OFFSET], 12, 15)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_levels_retured = VAL_EXTRACT_BITS(return_values[NUM_LEVEL_OFFSET], 0, 11); + val_print(VAL_PRINT_DEBUG, "\n NUM OF LEVELS RETURNED : %d", num_levels_retured); + + perf_level_array = &return_values[PERF_LEVEL_ARRAY_OFFSET]; + for (i = 0; i < num_levels_retured; i++) + { + perf_level = perf_level_array[i*PERF_LEVEL_ARRAY_COUNT]; + val_print(VAL_PRINT_DEBUG, "\n PERFORMANCE LEVEL[%d] : %08x", + skip_index + i, perf_level); + + if (min_perf_level > perf_level) + min_perf_level = perf_level; + + if (max_perf_level < perf_level) + max_perf_level = perf_level; + + /* Store an intermediate value */ + if (i == 1) { + if (num_levels_retured == 2) { + /* + * When only two levels are available, pick the + * minimum. + */ + interm_level = perf_level_array[0]; + } else { + interm_level = perf_level; + } + + val_performance_save_info(PERF_DOMAIN_INTERMEDIATE_LEVEL, domain_id, + interm_level); + } + + power_cost = perf_level_array[1 + (i * PERF_LEVEL_ARRAY_COUNT)]; + val_print(VAL_PRINT_DEBUG, "\n PERFORMANCE POWER COST[%d] : %08x", + skip_index + i, power_cost); + + latency = VAL_EXTRACT_BITS(perf_level_array[2 + (i * PERF_LEVEL_ARRAY_COUNT)], + 0, 15); + val_print(VAL_PRINT_DEBUG, "\n PERFORMANCE LATENCY[%d] : %08x", + skip_index + i, latency); + + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS( + perf_level_array[2 + (i * PERF_LEVEL_ARRAY_COUNT)], 16, 31)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + indicative_freq = perf_level_array[3 + (i * PERF_LEVEL_ARRAY_COUNT)]; + val_print(VAL_PRINT_DEBUG, "\n PERFORMANCE INDICATIVE FREQUENCY[%d] : %08x", + skip_index + i, indicative_freq); + + if (val_performance_get_info(PERF_DOMAIN_LVL_INDEX_MODE_SUPPORT, domain_id)) { + level_index = perf_level_array[4 + (i * PERF_LEVEL_ARRAY_COUNT)]; + val_print(VAL_PRINT_DEBUG, + "\n PERFORMANCE LEVEL INDEX[%d}] : %08x", + skip_index + i, level_index); + + if (min_perf_level > perf_level) + min_perf_level = perf_level; + + if (max_perf_level < perf_level) + max_perf_level = perf_level; + } + } + } while (num_remaining_levels > 0); + + if (val_compare("NUM OF LEVELS ", (skip_index + num_levels_retured), + val_performance_get_expected_number_of_level(domain_id))) + return VAL_STATUS_FAIL; + + val_performance_save_info(PERF_DOMAIN_MAX_LEVEL, domain_id, max_perf_level); + val_performance_save_info(PERF_DOMAIN_MIN_LEVEL, domain_id, min_perf_level); + + /* Performance domain attributes for invalid level index */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Query with invalid skip_index "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = (skip_index + num_levels_retured) + 1; /*Invalid level index*/ + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_DESCRIBE_LEVELS, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d009_v3.c b/test_pool/performance/test_d009_v3.c new file mode 100644 index 0000000000000000000000000000000000000000..061ce1612d926692af614d793fd9c2376e4a3e1c --- /dev/null +++ b/test_pool/performance/test_d009_v3.c @@ -0,0 +1,167 @@ +/** @file + * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 9) +#define TEST_DESC "Performance limits set change limit check " +#define PARAMETER_SIZE 3 + +/********* TEST ALGO ******************** + * Get the default level + * Set a only range max + * Get level & compare whether set level is success + * Set a only range min + * Get level & compare whether set level is success +*****************************************/ + +uint32_t performance_query_set_limit_v3(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t range_max, range_min; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check performance set levels for valid domain */ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + if (val_performance_get_info(PERF_DOMAIN_SET_PERFORMANCE_LIMIT_SUPPORT, domain_id) == 0) + continue; + run_flag = 1; + + val_print(VAL_PRINT_TEST, "\n PERFORMANCE DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Get performance limits "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LIMITS_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + range_max = return_values[RANGE_MAX_OFFSET]; + range_min = return_values[RANGE_MIN_OFFSET]; + + /* Change just range_max */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Get performance MAX limits "); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = range_max; + parameters[param_count++] = 0x0; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LIMITS_SET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Verify limits are expected values */ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LIMITS_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_compare("RANGE_MAX", return_values[RANGE_MAX_OFFSET], range_max)) + return VAL_STATUS_FAIL; + if (val_compare("RANGE_MIN", return_values[RANGE_MIN_OFFSET], range_min)) + return VAL_STATUS_FAIL; + + /* Change just range_min */ + val_print(VAL_PRINT_TEST, "\n [Check 3] Get performance MIN limits "); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x0; + parameters[param_count++] = range_min; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LIMITS_SET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Verify limits are expected values */ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LIMITS_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_compare("RANGE_MAX", return_values[RANGE_MAX_OFFSET], range_max)) + return VAL_STATUS_FAIL; + if (val_compare("RANGE_MIN", return_values[RANGE_MIN_OFFSET], range_min)) + return VAL_STATUS_FAIL; + } + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No domain support PERF SET LIMIT "); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d013_v4.c b/test_pool/performance/test_d013_v4.c new file mode 100644 index 0000000000000000000000000000000000000000..c486d5d418a50b8bedd3d46802b7007dba54aeea --- /dev/null +++ b/test_pool/performance/test_d013_v4.c @@ -0,0 +1,155 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 13) +#define TEST_DESC "Performance level set change level check " +#define PARAMETER_SIZE 2 + +/********* TEST ALGO ******************** + * Get the default level + * Set a new level + * Get level & compare whether set level is success +*****************************************/ + +uint32_t performance_query_set_level_v4(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t default_level, new_level; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check performance set levels for valid domain */ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + if (val_performance_get_info(PERF_DOMAIN_SET_PERFORMANCE_LEVEL_SUPPORT, domain_id) == 0) + continue; + run_flag = 1; + + /* Get the current performance level for the domain */ + val_print(VAL_PRINT_TEST, "\n PERFORMANCE DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query performance level"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LEVEL_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + default_level = return_values[PERFORMANCE_LEVEL_OFFSET]; + + /* Find the new performance level */ + if (default_level != val_performance_get_info(PERF_DOMAIN_MAX_LEVEL, domain_id)) + new_level = val_performance_get_info(PERF_DOMAIN_MAX_LEVEL, domain_id); + else + new_level = val_performance_get_info(PERF_DOMAIN_MIN_LEVEL, domain_id); + + /* Set new performance level for the domain */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Set changed performance level "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = new_level; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LEVEL_SET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Get and and compare with level set */ + val_print(VAL_PRINT_TEST, "\n [Check 3] Check changed perf level"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LEVEL_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_performance_get_info(PERF_DOMAIN_LVL_INDEX_MODE_SUPPORT, domain_id)) { + if (val_compare("LEVEL INDEX ", + return_values[PERFORMANCE_LEVEL_OFFSET], new_level)) + return VAL_STATUS_FAIL; + } else { + if (val_compare("PERFORMANCE LEVEL ", + return_values[PERFORMANCE_LEVEL_OFFSET], new_level)) + return VAL_STATUS_FAIL; + } + + /* Restore performance level for the domain */ + val_print(VAL_PRINT_TEST, "\n [Check 4] Restore performance level"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = default_level; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LEVEL_SET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No domain support PERF SET LEVEL "); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d028_v4.c b/test_pool/performance/test_d028_v4.c new file mode 100644 index 0000000000000000000000000000000000000000..e0f8481fd89507e58c80959cc21776f2ed0cf31d --- /dev/null +++ b/test_pool/performance/test_d028_v4.c @@ -0,0 +1,158 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 28) +#define TEST_DESC "Performance level get via fast channel " + +#define PARAMETER_SIZE 2 + +uint32_t performance_level_get_fast_channel_v4(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, message_id, attributes; + uint32_t parameters[PARAMETER_SIZE], perf_level; + uint32_t chl_addr_low, chl_addr_high, ch_size; + uint32_t run_flag = 0; + uint64_t chl_addr, v_chl_addr; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if describe fast channel is not supported*/ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query performance describe fast channel support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PERFORMANCE_DESCRIBE_FASTCHANNEL; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n PERF_DESCRIBE_FASTCHANNEL not supported "); + return VAL_STATUS_SKIP; + } + + /* Skip if no performance domains found */ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Continue till we find domain which supports fastchannel */ + if (val_performance_get_info(PERF_DOMAIN_FAST_CH_SUPPORT, domain_id) == 0) + continue; + + val_print(VAL_PRINT_TEST, "\n FAST CHANNEL supported for DOMAIN: %d", domain_id); + + message_id = PERFORMANCE_LEVEL_GET; + /* if perf level get doesn't support fastchannel, skip */ + if (val_performance_get_info(PERF_MESSAGE_FAST_CH_SUPPORT, message_id)) + { + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n FAST CHANNEL supported for perf level get"); + val_print(VAL_PRINT_TEST, "\n [Check 1] Get fast chl details for perf level get"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = message_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_DESCRIBE_FASTCHANNEL, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 3, 31)) != + VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Doorbell should not be supported for perf level get 4.5.2 */ + if (val_compare("DOORBELL SUPPORT", VAL_EXTRACT_BITS(attributes, 0, 0), NOT_SUPPORTED)) + return VAL_STATUS_FAIL; + + chl_addr_low = return_values[CHAN_ADDR_LOW_OFFSET]; + chl_addr_high = return_values[CHAN_ADDR_HIGH_OFFSET]; + chl_addr = (uint64_t)chl_addr_high << 32 | chl_addr_low; + ch_size = return_values[CHAN_SIZE_OFFSET]; + + if (!chl_addr || !ch_size) + return VAL_STATUS_FAIL; + + if (val_map_phys_to_virt(chl_addr, ch_size, &v_chl_addr)) + return VAL_STATUS_FAIL; + + perf_level = *((volatile uint32_t *)v_chl_addr); + + if (val_unmap_phys_to_virt(chl_addr, v_chl_addr, ch_size)) + return VAL_STATUS_FAIL; + + /* Get perf level from normal channel and and compare */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Get perf level via normal channel"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, PERFORMANCE_LEVEL_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_performance_get_info(PERF_DOMAIN_LVL_INDEX_MODE_SUPPORT, domain_id)) { + if (val_compare("LEVEL INDEX ", + return_values[PERFORMANCE_LEVEL_OFFSET], perf_level)) + return VAL_STATUS_FAIL; + } else { + if (val_compare("PERFORMANCE LEVEL ", + return_values[PERFORMANCE_LEVEL_OFFSET], perf_level)) + return VAL_STATUS_FAIL; + } + } + } + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No domain/msg support FAST CHANNEL "); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d030.c b/test_pool/performance/test_d030.c new file mode 100644 index 0000000000000000000000000000000000000000..e2247ac3418228e96934343367fd94073c088e7f --- /dev/null +++ b/test_pool/performance/test_d030.c @@ -0,0 +1,81 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 30) +#define TEST_DESC "Performance domain ext name get check " + +uint32_t performance_query_ext_domain_name(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint8_t *extended_name; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Performance domain name for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n Performance DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query extended domain name"); + + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_performance_get_info(PERF_DOMAIN_EXT_NAME_SUPPORT, domain_id); + if (extended_name_supp != PD_EXTENDED_DOMAIN_NAME) + { + val_print(VAL_PRINT_ERR, "\n Domain doesn't support extended name"); + continue; + } + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, + PERFORMANCE_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + extended_name = (uint8_t *) &return_values[PERF_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Performance name : %s", extended_name); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/performance/test_d031.c b/test_pool/performance/test_d031.c new file mode 100644 index 0000000000000000000000000000000000000000..7d10acf4755cec844c201e87ee2e7844416d1eb5 --- /dev/null +++ b/test_pool/performance/test_d031.c @@ -0,0 +1,101 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_performance.h" + +#define TEST_NUM (SCMI_PERFORMANCE_TEST_NUM_BASE + 31) +#define TEST_DESC "Performance get ext name for invalid domain " + +uint32_t performance_query_domain_name_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t extended_name_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get Extended name for invalid domain */ + domain_id = val_performance_get_info(NUM_PERF_DOMAINS, 0x00) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, + PERFORMANCE_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no domains found*/ + num_domains = val_performance_get_info(NUM_PERF_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Performance domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap domain name for unsupported domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_performance_get_info(PERF_DOMAIN_EXT_NAME_SUPPORT, domain_id); + + if (extended_name_supp == PD_EXTENDED_DOMAIN_NAME) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n Performance DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PERFORMANCE, + PERFORMANCE_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/Makefile b/test_pool/pin_control/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..673b7bd19f0d111aa3b55f0a47a7a652c9f4c7b1 --- /dev/null +++ b/test_pool/pin_control/Makefile @@ -0,0 +1,18 @@ +#/** @file +# * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. +# * SPDX-License-Identifier : Apache-2.0 +# * +# * Licensed under the Apache License, Version 2.0 (the "License"); +# * you may not use this file except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +#**/ + +include ${TOP}/test_pool/build_protocol.mk diff --git a/test_pool/pin_control/test_pi001.c b/test_pool/pin_control/test_pi001.c new file mode 100644 index 0000000000000000000000000000000000000000..33bdc546532aff377f0232ea1af631c12326cf51 --- /dev/null +++ b/test_pool/pin_control/test_pi001.c @@ -0,0 +1,63 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 1) +#define TEST_DESC "Pin Control protocol version check " + +#define MIN_RET_VAL_EXPECTED 1 + +uint32_t pin_control_query_protocol_version(uint32_t *version) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t *parameters; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + val_print(VAL_PRINT_TEST, "\n [Check 1] Query protocol version"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters = NULL; /* No parameters for this command */ + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_VERSION, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (return_value_count != MIN_RET_VAL_EXPECTED) + return VAL_STATUS_FAIL; + + *version = return_values[VERSION_OFFSET]; + val_print(VAL_PRINT_ERR, "\n VERSION : 0x%08x ", *version); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi002.c b/test_pool/pin_control/test_pi002.c new file mode 100644 index 0000000000000000000000000000000000000000..eae382e4ceafb20cabfe5da17368dc3dc6cda1f9 --- /dev/null +++ b/test_pool/pin_control/test_pi002.c @@ -0,0 +1,86 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 2) +#define TEST_DESC "Pin Control protocol attributes check " + +uint32_t pin_control_query_protocol_attributes(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t *parameters; + uint32_t num_functions, num_groups, num_pins; + uint32_t attributes_high, attributes_low; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Query pin control protocol attributes and check number of pins, groups and functions */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query protocol attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters = NULL; /* No parameters for this command */ + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_PROTOCOL_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes_low = return_values[ATTRIBUTES_LOW_OFFSET]; + + num_pins = VAL_EXTRACT_BITS(attributes_low, 0, 15); + if (val_compare("NUM PINS", num_pins, val_pin_control_get_expected_num_pins())) + return VAL_STATUS_FAIL; + + num_groups = VAL_EXTRACT_BITS(attributes_low, 16, 31); + if (val_compare("NUM GROUPS", num_groups, val_pin_control_get_expected_num_groups())) + return VAL_STATUS_FAIL; + + attributes_high = return_values[ATTRIBUTES_HIGH_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes_high, + 16, 31) != VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + num_functions = VAL_EXTRACT_BITS(attributes_high, 0, 15); + if (val_compare("NUM FUNCTIONS", num_functions, val_pin_control_get_expected_num_functions())) + return VAL_STATUS_FAIL; + + /* Save the number of pins */ + val_pin_control_save_info(PC_NUM_PINS, 0, num_pins); + + /* Save the number of groups */ + val_pin_control_save_info(PC_NUM_GROUPS, 0, num_groups); + + /* Save the number of functions */ + val_pin_control_save_info(PC_NUM_FUNCTIONS, 0, num_functions); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi003.c b/test_pool/pin_control/test_pi003.c new file mode 100644 index 0000000000000000000000000000000000000000..dd48904058e67a3c3d95e78594ff7dae932b6050 --- /dev/null +++ b/test_pool/pin_control/test_pi003.c @@ -0,0 +1,122 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 3) +#define TEST_DESC "Pin ctrl msg attributes mandatory cmds check " + +uint32_t pin_control_query_mandatory_command_support(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + val_print(VAL_PRINT_TEST, "\n [Check 1] PIN CONTROL ATTRIBUTES support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_ATTRIBUTES; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n [Check 2] PIN CONTROL CONFIG GET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_CONFIG_GET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n [Check 3] PIN CONTROL CONFIG SET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_CONFIG_SET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n [Check 4] PIN CONTROL FUNCTION SELECT support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_FUNCTION_SELECT; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi004.c b/test_pool/pin_control/test_pi004.c new file mode 100644 index 0000000000000000000000000000000000000000..7d9b53b7f3adaf08d0ed7d2f7207d1f6541dede6 --- /dev/null +++ b/test_pool/pin_control/test_pi004.c @@ -0,0 +1,77 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 4) +#define TEST_DESC "pin ctrl msg attributes invalid msg id check " + +uint32_t pin_control_invalid_messageid_call(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t *parameters; + uint32_t message_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Sending invalid pin_control protocol cmd should fail */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Invalid command invocation"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters = NULL; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_INVALID_COMMAND, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Query support for invalid pin_control protocol command should return status NOT_FOUND */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Query undefined command support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_INVALID_COMMAND; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} + diff --git a/test_pool/pin_control/test_pi005.c b/test_pool/pin_control/test_pi005.c new file mode 100644 index 0000000000000000000000000000000000000000..24d59a35bbd94dc3f9e530c67e7463dc5881344a --- /dev/null +++ b/test_pool/pin_control/test_pi005.c @@ -0,0 +1,197 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 5) +#define TEST_DESC "Pin Control attributes check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_attributes_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_pins = 0, identifier = 0; + uint32_t num_groups = 0, num_functions = 0; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t attributes = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Discover pin control attributes for all pins */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No Pins found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + for (identifier = 0; identifier < num_pins; identifier++) + { + val_print(VAL_PRINT_TEST, "\n PIN ID: %d", identifier); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query Pin Control attribute"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = identifier; + parameters[param_count++] = PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 16, 30) != + VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + /* If flag parameter is set to PIN, then this value should be 0 */ + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 0, 15) != + VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_INFO, "\n Extended Name Support: %d", + VAL_EXTRACT_BITS(attributes, 31, 31)); + val_pin_control_save_ext_name_info(PC_PIN_NAME, identifier, + VAL_EXTRACT_BITS(attributes, 31, 31)); + + val_print(VAL_PRINT_INFO, "\n PIN_NAME: %s ", + (uint8_t *) &return_values[NAME_OFFSET]); + } + + /* Discover pin control attributes for all groups */ + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No Groups found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM GROUPS : %d", num_groups); + + for (identifier = 0; identifier < num_groups; identifier++) + { + val_print(VAL_PRINT_TEST, "\n GROUP ID: %d", identifier); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query Pin Control attribute"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = identifier; + parameters[param_count++] = GROUP_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 16, 30) != + VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + if (val_compare("NUM OF PINS IN GROUP", + VAL_EXTRACT_BITS(attributes, 0, 15), + val_pin_control_get_expected_pins_in_group(identifier))) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n NUM OF PINS IN THE GROUP: %d", + VAL_EXTRACT_BITS(attributes, 0, 15)); + + val_pin_control_save_info(PC_NUM_PINS_IN_GROUP, identifier, + VAL_EXTRACT_BITS(attributes, 0, 15)); + + val_print(VAL_PRINT_INFO, "\n Extended Name Support: %d", + VAL_EXTRACT_BITS(attributes, 31, 31)); + val_pin_control_save_ext_name_info(PC_GROUP_NAME, identifier, + VAL_EXTRACT_BITS(attributes, 31, 31)); + + val_print(VAL_PRINT_INFO, "\n GROUP_NAME: %s ", + (uint8_t *) &return_values[NAME_OFFSET]); + } + + /* Discover pin control attributes for all functions */ + num_functions = val_pin_control_get_info(0, PC_NUM_FUNCTIONS); + if (num_functions == 0) { + val_print(VAL_PRINT_ERR, "\n No FUNCTIONs found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM FUNCTIONS : %d", num_functions); + + for (identifier = 0; identifier < num_functions; identifier++) + { + val_print(VAL_PRINT_TEST, "\n FUNCTION ID: %d", identifier); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query Pin Control attribute"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = identifier; + parameters[param_count++] = FUNCTION_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 16, 30) != + VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + if (val_compare("NUM OF GROUPS IN FUNCTION", + VAL_EXTRACT_BITS(attributes, 0, 15), + val_pin_control_get_expected_groups_in_func(identifier))) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n NUM OF GROUPS IN THE FUNCTION: %d", + VAL_EXTRACT_BITS(attributes, 0, 15)); + + val_pin_control_save_info(PC_NUM_GROUPS_IN_FUNCTION, identifier, + VAL_EXTRACT_BITS(attributes, 0, 15)); + + val_print(VAL_PRINT_INFO, "\n Extended Name Support: %d", + VAL_EXTRACT_BITS(attributes, 31, 31)); + val_pin_control_save_ext_name_info(PC_FUNCTION_NAME, identifier, + VAL_EXTRACT_BITS(attributes, 31, 31)); + + val_print(VAL_PRINT_INFO, "\n FUNCTION_NAME: %s ", + (uint8_t *) &return_values[NAME_OFFSET]); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi006.c b/test_pool/pin_control/test_pi006.c new file mode 100644 index 0000000000000000000000000000000000000000..7f638f20e62fdd620791c8c67b9c6807009f1579 --- /dev/null +++ b/test_pool/pin_control/test_pi006.c @@ -0,0 +1,59 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 6) +#define TEST_DESC "Pin Control attributes invalid param check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_attributes_invalid_param_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t identifier = 0; + uint32_t parameters[PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Pin control attributes for invalid identifier should fail*/ + identifier = val_pin_control_get_info(0, PC_NUM_PINS) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes with invalid identifier: %d", + identifier); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = identifier; + parameters[param_count++] = PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi007.c b/test_pool/pin_control/test_pi007.c new file mode 100644 index 0000000000000000000000000000000000000000..088e89ac6dcb46cd19f33d74a26cdce491936703 --- /dev/null +++ b/test_pool/pin_control/test_pi007.c @@ -0,0 +1,181 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 7) +#define TEST_DESC "pin ctrl list associations check " +#define PARAMETER_SIZE 3 + +uint32_t pin_control_query_list_associations(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_groups = 0, num_functions = 0; + uint32_t pc_id = 0; + uint32_t index, num_remaining_ids, num_ids_returned; + uint32_t i, selector_id, *pin_ids_array; + uint32_t pins_count, groups_count; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check pin control list associations for valid group identifiers */ + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM GROUPS : %d", num_groups); + + /* Check num of pins for each group identifier*/ + for (pc_id = 0; pc_id < num_groups; pc_id++) + { + index = 0; + num_remaining_ids = 0; + num_ids_returned = 0; + pins_count = 0; + + val_print(VAL_PRINT_TEST, "\n PIN CONTROL GROUP ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query list associations"); + + /* Get all the available pin id's for each group identifier*/ + do + { + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = GROUP_SELECTOR; + index += num_ids_returned; + parameters[param_count++] = index; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_LIST_ASSOCIATIONS, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + num_remaining_ids = VAL_EXTRACT_BITS(return_values[RET_FLAGS_OFFSET], 16, 31); + val_print(VAL_PRINT_DEBUG, "\n NUM OF REMAINING PIN IDS: %d", + num_remaining_ids); + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[RET_FLAGS_OFFSET], 12, 15)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_ids_returned = VAL_EXTRACT_BITS(return_values[RET_FLAGS_OFFSET], 0, 11); + val_print(VAL_PRINT_DEBUG, "\n NUM OF PIN IDS RETURNED : %d", + num_ids_returned); + + pin_ids_array = &return_values[PIN_CONTROL_IDS_ARRAY_OFFSET]; + /* Print the pin id's associated with the group */ + for (i = 0; i < num_ids_returned; i++) + { + selector_id = pin_ids_array[i]; + val_print(VAL_PRINT_DEBUG, "\n PIN ID[%d] : %d", + i, selector_id); + } + pins_count += num_ids_returned; + val_print(VAL_PRINT_DEBUG, "\n num_remaining_ids: %d", num_remaining_ids); + } while (num_remaining_ids > 0); + + val_pin_control_save_info(PC_NUM_PINS_IN_GROUP, pc_id, pins_count); + } + } + + /* Check pin control list associations for valid function identifiers */ + num_functions = val_pin_control_get_info(0, PC_NUM_FUNCTIONS); + if (num_functions == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control function identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM FUNCTIONS : %d", num_functions); + + /* Check num of pins for each function identifier*/ + for (pc_id = 0; pc_id < num_functions; pc_id++) + { + index = 0; + num_remaining_ids = 0; + num_ids_returned = 0; + groups_count = 0; + + val_print(VAL_PRINT_TEST, "\n PIN CONTROL FUNCTION ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query list associations"); + + /* Get all the available pin id's for each function identifier*/ + do + { + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = FUNCTION_SELECTOR; + index += num_ids_returned; + parameters[param_count++] = index; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_LIST_ASSOCIATIONS, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + num_remaining_ids = VAL_EXTRACT_BITS(return_values[RET_FLAGS_OFFSET], 16, 31); + val_print(VAL_PRINT_DEBUG, "\n NUM OF REMAINING GROUP IDS: %d", + num_remaining_ids); + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[RET_FLAGS_OFFSET], 12, 15)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_ids_returned = VAL_EXTRACT_BITS(return_values[RET_FLAGS_OFFSET], 0, 11); + val_print(VAL_PRINT_DEBUG, "\n NUM OF GROUP IDS RETURNED : %d", + num_ids_returned); + + pin_ids_array = &return_values[PIN_CONTROL_IDS_ARRAY_OFFSET]; + /* Print the group id's associated with the function */ + for (i = 0; i < num_ids_returned; i++) + { + selector_id = pin_ids_array[i]; + val_print(VAL_PRINT_DEBUG, "\n GROUP ID[%d] : %d", + i, selector_id); + } + groups_count += num_ids_returned; + } while (num_remaining_ids > 0); + + val_pin_control_save_info(PC_NUM_GROUPS_IN_FUNCTION, pc_id, groups_count); + } + } + return VAL_STATUS_PASS; +} + diff --git a/test_pool/pin_control/test_pi008.c b/test_pool/pin_control/test_pi008.c new file mode 100644 index 0000000000000000000000000000000000000000..004255ebb846fb21366853f70c6271e5741cb98c --- /dev/null +++ b/test_pool/pin_control/test_pi008.c @@ -0,0 +1,66 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 8) +#define TEST_DESC "pin ctrl list associations invalid id check " +#define PARAMETER_SIZE 3 + +uint32_t pin_control_query_list_associations_invalid_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t pc_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check pin control list associations for invalid group identifiers */ + pc_id = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (pc_id == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + val_print(VAL_PRINT_TEST, "\n [Check 1] Query list assoc with invalid group id: %d", + pc_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = GROUP_SELECTOR; + parameters[param_count++] = 0; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_LIST_ASSOCIATIONS, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} + diff --git a/test_pool/pin_control/test_pi009.c b/test_pool/pin_control/test_pi009.c new file mode 100644 index 0000000000000000000000000000000000000000..e0ea210fd6d9cb53b05c9295298968162d883fa2 --- /dev/null +++ b/test_pool/pin_control/test_pi009.c @@ -0,0 +1,191 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 9) +#define TEST_DESC "pin ctrl config get check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_query_config_get_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t attributes = 0; + uint32_t num_groups = 0, num_pins = 0; + uint32_t pc_id = 0; + uint32_t num_remaining_configs, num_configs_returned; + uint32_t i, *pin_configs_array; + uint32_t configs_count; + uint32_t entry_0, entry_1; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Query pin control config get for pin identifiers */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + /* Get configs of each pin identifier*/ + for (pc_id = 0; pc_id < num_pins; pc_id++) + { + num_remaining_configs = 0; + num_configs_returned = 0; + configs_count = 0; + + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query config get"); + + /* Get all the available configs for each pin identifier */ + do + { + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (GET_ALL_CONFIGS << GET_ALL_CONFIGS_LOW) + + (PIN_SELECTOR << SELECTOR_LOW); + parameters[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + num_remaining_configs = + VAL_EXTRACT_BITS(return_values[RET_NUM_CONFIGS_OFFSET], 24, 31); + val_print(VAL_PRINT_DEBUG, "\n NUM OF REMAINING PIN CONFIGS: %d", + num_remaining_configs); + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[RET_NUM_CONFIGS_OFFSET], 8, 23)) + != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_configs_returned = + VAL_EXTRACT_BITS(return_values[RET_NUM_CONFIGS_OFFSET], 0, 7); + val_print(VAL_PRINT_DEBUG, "\n NUM OF PIN CONFIGS RETURNED : %d", + num_configs_returned); + + pin_configs_array = &return_values[RET_CONFIGS_ARRAY_OFFSET]; + /* Print the pin id's associated with the group */ + for (i = 0; i < num_configs_returned; i++) + { + entry_0 = pin_configs_array[i * 2]; + val_print(VAL_PRINT_DEBUG, "\n CONFIG TYPE: %d", + VAL_EXTRACT_BITS(entry_0, 0, 7)); + entry_1 = pin_configs_array[(i * 2) + 1]; + val_print(VAL_PRINT_DEBUG, "\n CONFIG VALUE: %d", entry_1); + } + configs_count += num_configs_returned; + val_print(VAL_PRINT_DEBUG, "\n num_remaining_configs: %d", + num_remaining_configs); + } while (num_remaining_configs > 0); + } + } + + /* Query pin control config get for group identifiers */ + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM GROUPS : %d", num_groups); + + /* Get configs of each group identifier*/ + for (pc_id = 0; pc_id < num_groups; pc_id++) + { + num_remaining_configs = 0; + num_configs_returned = 0; + configs_count = 0; + + val_print(VAL_PRINT_TEST, "\n PIN CONTROL GROUP ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query config get"); + + /* Get all the available configs for each group identifier */ + do + { + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (GET_ALL_CONFIGS << GET_ALL_CONFIGS_LOW) + + (GROUP_SELECTOR << SELECTOR_LOW); + parameters[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + num_remaining_configs = + VAL_EXTRACT_BITS(return_values[RET_NUM_CONFIGS_OFFSET], 24, 31); + val_print(VAL_PRINT_DEBUG, "\n NUM OF REMAINING GROUP CONFIGS: %d", + num_remaining_configs); + + if (val_reserved_bits_check_is_zero( + VAL_EXTRACT_BITS(return_values[RET_NUM_CONFIGS_OFFSET], 8, 23)) + != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_configs_returned = + VAL_EXTRACT_BITS(return_values[RET_NUM_CONFIGS_OFFSET], 0, 7); + val_print(VAL_PRINT_DEBUG, "\n NUM OF GROUP CONFIGS RETURNED : %d", + num_configs_returned); + + pin_configs_array = &return_values[RET_CONFIGS_ARRAY_OFFSET]; + /* Print the pin id's associated with the group */ + for (i = 0; i < num_configs_returned; i++) + { + entry_0 = pin_configs_array[i * 2]; + val_print(VAL_PRINT_DEBUG, "\n CONFIG TYPE: %d", + VAL_EXTRACT_BITS(entry_0, 0, 7)); + entry_1 = pin_configs_array[(i * 2) + 1]; + val_print(VAL_PRINT_DEBUG, "\n CONFIG VALUE: %d", entry_0); + } + configs_count += num_configs_returned; + val_print(VAL_PRINT_DEBUG, "\n num_remaining_configs: %d", + num_remaining_configs); + } while (num_remaining_configs > 0); + } + } + + return VAL_STATUS_PASS; +} + diff --git a/test_pool/pin_control/test_pi010.c b/test_pool/pin_control/test_pi010.c new file mode 100644 index 0000000000000000000000000000000000000000..d6db95187be4b05a1cf4bd1019a8cc30e948fcba --- /dev/null +++ b/test_pool/pin_control/test_pi010.c @@ -0,0 +1,66 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 10) +#define TEST_DESC "pin ctrl config get invalid id check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_config_get_invalid_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t pc_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check pin control config get for invalid group identifiers */ + pc_id = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (pc_id == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + val_print(VAL_PRINT_TEST, "\n [Check 1] Query config get with invalid group id: %d", + pc_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = (GET_ALL_CONFIGS << GET_ALL_CONFIGS_LOW) + + (GROUP_SELECTOR << SELECTOR_LOW);; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} + diff --git a/test_pool/pin_control/test_pi011.c b/test_pool/pin_control/test_pi011.c new file mode 100644 index 0000000000000000000000000000000000000000..245a2b4515dd85ef1cf868fe481b9f0096bb6dff --- /dev/null +++ b/test_pool/pin_control/test_pi011.c @@ -0,0 +1,307 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 11) +#define TEST_DESC "pin ctrl config set check " +#define PARAMETER_SIZE 4 + +#define CONFIG_ENABLE 1 +#define CONFIG_DISABLE 0 + +/************ TEST ALGO ****************** + * Get current Config Values + * Choose a different values for Config Type + * Set new config values for Config type + * Check new config values has been set. + * Restore the default config values +*****************************************/ + +uint32_t pin_control_query_config_set_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t attributes = 0; + uint32_t num_groups = 0, num_pins = 0; + uint32_t pc_id = 0; + uint32_t *pin_configs_array; + uint32_t config_type, default_config_value; + uint32_t new_config_value; + uint32_t entry_0, entry_1; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Query pin control config set for pin identifiers */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + /* Get configs of each pin identifier*/ + for (pc_id = 0; pc_id < num_pins; pc_id++) + { + /* STEP 1:Reading pin configuration */ + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [STEP 1] Get Pin config "); + + /* Get all the available configs for each pin identifier */ + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = ((PIN_SELECTOR << SELECTOR_LOW) + DEFAULT_CONFIG_TYPE); + parameters[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + pin_configs_array = &return_values[RET_CONFIGS_ARRAY_OFFSET]; + /* Print the pin id's associated with the group */ + config_type = VAL_EXTRACT_BITS(pin_configs_array[0], 0, 7); + val_print(VAL_PRINT_DEBUG, "\n DEFAULT CONFIG TYPE : %d", config_type); + + default_config_value = pin_configs_array[1]; + val_print(VAL_PRINT_DEBUG, "\n DEFAULT CONFIG VALUE: %d", + default_config_value); + + /* STEP:2 SET Different Config Values for the Config Type */ + val_print(VAL_PRINT_TEST, "\n [Step 2] Choose new config value for pin"); + + if (default_config_value == CONFIG_DISABLE) + new_config_value = CONFIG_ENABLE; + else + new_config_value = CONFIG_DISABLE; + + /*STEP:3 Setting new config value for pin*/ + val_print(VAL_PRINT_TEST, "\n [Step 3] Set new config value"); + val_print(VAL_PRINT_DEBUG, "\n CONFIG TYPE : %d", + VAL_EXTRACT_BITS(config_type, 0, 7)); + val_print(VAL_PRINT_DEBUG, "\n NEW CONFIG VALUE: %d", new_config_value); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (1 << SET_CONFIGS_LOW) + PIN_SELECTOR; + parameters[param_count++] = attributes; + parameters[param_count++] = config_type; + parameters[param_count++] = new_config_value; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* STEP 4 : Verify new config_value has been set */ + val_print(VAL_PRINT_TEST, "\n [Step 4] Verify new config value "); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = ((PIN_SELECTOR << SELECTOR_LOW) + DEFAULT_CONFIG_TYPE); + parameters[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + pin_configs_array = &return_values[RET_CONFIGS_ARRAY_OFFSET]; + val_print_return_values(return_value_count, return_values); + + entry_0 = VAL_EXTRACT_BITS(pin_configs_array[0], 0, 7); + if (val_compare("Config Type ", entry_0, config_type)) + return VAL_STATUS_FAIL; + + entry_1 = pin_configs_array[1]; + if (val_compare("New Config Value ", entry_1, new_config_value)) + return VAL_STATUS_FAIL; + + /* STEP 5 : Set default config value back */ + val_print(VAL_PRINT_TEST, "\n [Step 5] Set default config value"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (1 << SET_CONFIGS_LOW) + PIN_SELECTOR; + parameters[param_count++] = attributes; + parameters[param_count++] = config_type; + parameters[param_count++] = default_config_value; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + } + + /* Query pin control config set for group identifiers */ + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + val_print(VAL_PRINT_DEBUG, "\n NUM GROUPS : %d", num_groups); + + /* Get configs of each group identifier*/ + for (pc_id = 0; pc_id < num_groups; pc_id++) + { + /* STEP 1:Reading pin configuration */ + val_print(VAL_PRINT_TEST, "\n PIN CONTROL GROUP ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [STEP 1] Get Group config "); + + /* Get all the available configs for each group identifier */ + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = ((GROUP_SELECTOR << SELECTOR_LOW) + DEFAULT_CONFIG_TYPE); + parameters[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + pin_configs_array = &return_values[RET_CONFIGS_ARRAY_OFFSET]; + /* Print the pin id's associated with the group */ + config_type = VAL_EXTRACT_BITS(pin_configs_array[0], 0, 7); + val_print(VAL_PRINT_DEBUG, "\n DEFAULT CONFIG TYPE : %d", config_type); + + default_config_value = pin_configs_array[1]; + val_print(VAL_PRINT_DEBUG, "\n DEFAULT CONFIG VALUE: %d", + default_config_value); + + /* STEP:2 SET Different Config Values for the Config Type */ + val_print(VAL_PRINT_TEST, "\n [Step 2] Choose new config value for group"); + if (default_config_value == CONFIG_DISABLE) + new_config_value = CONFIG_ENABLE; + else + new_config_value = CONFIG_DISABLE; + + /*STEP:3 Setting new config value for group*/ + val_print(VAL_PRINT_TEST, "\n [Step 3] Set new config value"); + val_print(VAL_PRINT_DEBUG, "\n CONFIG TYPE : %d", + VAL_EXTRACT_BITS(config_type, 0, 7)); + val_print(VAL_PRINT_DEBUG, "\n NEW CONFIG VALUE: %d", new_config_value); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (1 << SET_CONFIGS_LOW) + GROUP_SELECTOR; + parameters[param_count++] = attributes; + parameters[param_count++] = config_type; + parameters[param_count++] = new_config_value; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* STEP 4 : Verify new config_value has been set */ + val_print(VAL_PRINT_TEST, "\n [Step 4] Verify new config value "); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = ((GROUP_SELECTOR << SELECTOR_LOW) + DEFAULT_CONFIG_TYPE); + parameters[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + pin_configs_array = &return_values[RET_CONFIGS_ARRAY_OFFSET]; + val_print_return_values(return_value_count, return_values); + + entry_0 = VAL_EXTRACT_BITS(pin_configs_array[0], 0, 7); + if (val_compare("Config Type ", entry_0, config_type)) + return VAL_STATUS_FAIL; + + entry_1 = pin_configs_array[1]; + if (val_compare("New Config Value ", entry_1, new_config_value)) + return VAL_STATUS_FAIL; + + /* STEP 5 : Set default config value back */ + val_print(VAL_PRINT_TEST, "\n [Step 5] Set default config value"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (1 << SET_CONFIGS_LOW) + GROUP_SELECTOR; + parameters[param_count++] = attributes; + parameters[param_count++] = config_type; + parameters[param_count++] = default_config_value; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + } + } +return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi012.c b/test_pool/pin_control/test_pi012.c new file mode 100644 index 0000000000000000000000000000000000000000..69e343ee3e1d377f48ce32a71f34ec05d2cb2cd3 --- /dev/null +++ b/test_pool/pin_control/test_pi012.c @@ -0,0 +1,102 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 12) +#define TEST_DESC "pin ctrl config set invalid param check " + +#define PARAMETER_SIZE 4 +#define CONFIG_NUM_SET 1 + +#define CONFIG_ENABLE 1 + +uint32_t pin_control_config_set_invalid_param_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t attributes = 0; + uint32_t num_pins = 0; + uint32_t pc_id = 0; + uint32_t config_value, config_type; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + + for (pc_id = 0; pc_id < num_pins; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid Config Type "); + + config_type = RESERVED_CONFIG_TYPE; + config_value = CONFIG_ENABLE; + + /* Query with invalid config type should fail with INVALID_PARAMETERS*/ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (CONFIG_NUM_SET << SET_CONFIGS_LOW) + PIN_SELECTOR; + parameters[param_count++] = attributes; + parameters[param_count++] = config_type; + parameters[param_count++] = config_value; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query with invalid attribute"); + + /* Query with invalid attribute should fail with INVALID_PARAMETERS*/ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = PINCTRL_SET_INVALID_ATTIBUTE; + parameters[param_count++] = config_type; + parameters[param_count++] = config_value; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } +} +return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi013.c b/test_pool/pin_control/test_pi013.c new file mode 100644 index 0000000000000000000000000000000000000000..56a6947f06b1ef0d1faa2edf25d33abc75492fe5 --- /dev/null +++ b/test_pool/pin_control/test_pi013.c @@ -0,0 +1,77 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 13) +#define TEST_DESC "pin ctrl config set invalid id check " + +#define PARAMETER_SIZE 4 +#define CONFIG_NUM_SET 1 + +#define CONFIG_ENABLE 1 + +uint32_t pin_control_config_set_invalid_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t attributes = 0; + uint32_t pc_id = 0; + uint32_t config_value, config_type; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check pin control config get for invalid group identifiers */ + pc_id = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (pc_id == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + val_print(VAL_PRINT_TEST, "\n [Check 1] Query config set with invalid group id: %d", + pc_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + attributes = (CONFIG_NUM_SET << SET_CONFIGS_LOW) + GROUP_SELECTOR; + parameters[param_count++] = attributes; + + config_type = DEFAULT_CONFIG_TYPE; + config_value = CONFIG_ENABLE; + + parameters[param_count++] = config_type; + parameters[param_count++] = config_value; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi014.c b/test_pool/pin_control/test_pi014.c new file mode 100644 index 0000000000000000000000000000000000000000..1896fa1a62012c1bf070b455cab77fd1726eff44 --- /dev/null +++ b/test_pool/pin_control/test_pi014.c @@ -0,0 +1,127 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 14) +#define TEST_DESC "pin ctrl function select check " +#define PARAMETER_SIZE 3 + +uint32_t pin_control_query_function_select_check(void) +{ + int32_t status; + size_t return_value_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_groups = 0, num_pins = 0, num_functions = 0; + uint32_t pc_id = 0, function_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + num_functions = val_pin_control_get_info(0, PC_NUM_FUNCTIONS); + if (num_functions == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control function identifiers found"); + return VAL_STATUS_SKIP; + } + + /* Query pin control function select for pin identifiers */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + /* Check function select for each pin identifier*/ + for (pc_id = 0; pc_id < num_pins; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pc_id); + + for (function_id = 0; function_id < num_functions; function_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL FUNCTION ID: %d", function_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query function select for pin ids"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = function_id; + parameters[param_count++] = PIN_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_FUNCTION_SELECT, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (!((val_compare_status(status, SCMI_SUCCESS) == VAL_STATUS_PASS) || + (val_compare_status(status, SCMI_NOT_SUPPORTED) == VAL_STATUS_PASS) || + (val_compare_status(status, SCMI_IN_USE) == VAL_STATUS_PASS))) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + } + } + + /* check function select for group identifiers */ + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM GROUPS : %d", num_groups); + + /* Check function select for each group identifier*/ + for (pc_id = 0; pc_id < num_groups; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL GROUP ID: %d", pc_id); + + for (function_id = 0; function_id < num_functions; function_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL FUNCTION ID: %d", function_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Query function select for group ids"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = function_id; + parameters[param_count++] = GROUP_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_FUNCTION_SELECT, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (!((val_compare_status(status, SCMI_SUCCESS) == VAL_STATUS_PASS) || + (val_compare_status(status, SCMI_NOT_SUPPORTED) == VAL_STATUS_PASS) || + (val_compare_status(status, SCMI_IN_USE) == VAL_STATUS_PASS))) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + } + } + + return VAL_STATUS_PASS; +} + diff --git a/test_pool/pin_control/test_pi015.c b/test_pool/pin_control/test_pi015.c new file mode 100644 index 0000000000000000000000000000000000000000..b469df10b3bb96ef94779f492bbd27cc419b4d6c --- /dev/null +++ b/test_pool/pin_control/test_pi015.c @@ -0,0 +1,112 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 15) +#define TEST_DESC "pin ctrl function select invalid case check " +#define PARAMETER_SIZE 3 + +uint32_t pin_control_query_function_select_invalid_case_check(void) +{ + int32_t status; + size_t return_value_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_pins = 0, num_functions = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + num_functions = val_pin_control_get_info(0, PC_NUM_FUNCTIONS); + if (num_functions == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control function identifiers found"); + return VAL_STATUS_SKIP; + } + + /* Query pin control function select with invalid identifier */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_TEST, "\n [Check 1] Query function select for invalid pin id"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + /* pins 0 to num_pins - 1 are valid, using num_pins as invalid pin */ + parameters[param_count++] = num_pins; + parameters[param_count++] = num_functions - 1; + parameters[param_count++] = PIN_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_FUNCTION_SELECT, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, + "\n [Check 2] Query function select for invalid function id"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = num_pins - 1; + /* functions 0 to num_functions - 1 are valid, using num_functions as invalid pin */ + parameters[param_count++] = num_functions; + parameters[param_count++] = PIN_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_FUNCTION_SELECT, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, + "\n [Check 3] Query function select for invalid flags"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = num_pins - 1; + parameters[param_count++] = num_functions - 1; + /* Making reserved bit as 1 to make invalid flag */ + parameters[param_count++] = PIN_SELECTOR + (1 << FUNCTION_SELECT_FLAGS_RESERVED_LOW); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_FUNCTION_SELECT, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi016.c b/test_pool/pin_control/test_pi016.c new file mode 100644 index 0000000000000000000000000000000000000000..987131737afe14e0b7cbfce2ca208f85654a7576 --- /dev/null +++ b/test_pool/pin_control/test_pi016.c @@ -0,0 +1,198 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 16) +#define TEST_DESC "Pin ctrl request control check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_request_control_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_groups = 0, num_pins = 0, pc_id = 0; + uint32_t run_flags = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + val_print(VAL_PRINT_TEST, "\n [Check 1] PIN CONTROL REQUEST support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_REQUEST; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n PIN CONTROL REQUEST not supported "); + return VAL_STATUS_SKIP; + } + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n [Check 2] PIN CONTROL RELEASE support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_RELEASE; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n PIN CONTROL RELEASE not supported "); + return VAL_STATUS_FAIL; + } + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n [Check 3] PIN CONTROL REQUEST check for pin ids"); + + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + run_flags = 1; + + /* Check function select for each pin identifier*/ + for (pc_id = 0; pc_id < num_pins; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pc_id); + + /* Requesting control of pin id for an agent*/ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_REQUEST, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_DENIED) == VAL_STATUS_PASS) + { + val_print(VAL_PRINT_ERR, "\n Agent do not have access to the pin"); + return VAL_STATUS_SKIP; + } + + if (!((val_compare_status(status, SCMI_SUCCESS) == VAL_STATUS_PASS) || + (val_compare_status(status, SCMI_IN_USE) == VAL_STATUS_PASS))) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Releasing control of pin id by an agent */ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_RELEASE, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + } + + val_print(VAL_PRINT_TEST, "\n [Check 4] PIN CONTROL REQUEST check for group ids"); + + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM GROUPS : %d", num_groups); + run_flags = 1; + + /* Check function select for each group identifier*/ + for (pc_id = 0; pc_id < num_groups; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL GROUP ID: %d", pc_id); + + /* Requesting control of group id for an agent*/ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = GROUP_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_REQUEST, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_DENIED) == VAL_STATUS_PASS) + { + val_print(VAL_PRINT_ERR, "\n Agent do not have access to the group"); + return VAL_STATUS_SKIP; + } + + if (!((val_compare_status(status, SCMI_SUCCESS) == VAL_STATUS_PASS) || + (val_compare_status(status, SCMI_IN_USE) == VAL_STATUS_PASS))) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Releasing control of group id by an agent */ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = GROUP_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_RELEASE, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + } + + if (run_flags == 0) + { + val_print(VAL_PRINT_ERR, "\n No pin control pin/group identifiers found"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi017.c b/test_pool/pin_control/test_pi017.c new file mode 100644 index 0000000000000000000000000000000000000000..728f4e8769063181f7b83d53879e36634b6ff0f1 --- /dev/null +++ b/test_pool/pin_control/test_pi017.c @@ -0,0 +1,101 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 17) +#define TEST_DESC "pin ctrl request invalid case check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_query_request_invalid_case_check(void) +{ + int32_t status; + size_t return_value_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_pins = 0; + uint32_t message_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* If PIN CONTROL REQUEST is not supported, skip the test */ + val_print(VAL_PRINT_TEST, "\n [Check 1] PIN CONTROL REQUEST cmd support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_REQUEST; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n PIN CONTROL REQUEST not supported "); + return VAL_STATUS_SKIP; + } + + val_print(VAL_PRINT_TEST, "\n [Check 2] PIN CONTROL REQUEST check for invalid pin ids"); + + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + /* Requesting control of invalid pin id for an agent*/ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + /* pins 0 to num_pins - 1 are valid, using num_pins as invalid pin */ + parameters[param_count++] = num_pins; + parameters[param_count++] = PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_REQUEST, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Requesting control of invalid flags for an agent*/ + val_print(VAL_PRINT_TEST, + "\n [Check 3] Query pin control request cmd for invalid flags"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = num_pins - 1; + /* Making reserved bit as 1 to make invalid flag */ + parameters[param_count++] = PIN_SELECTOR + (1 << REQUEST_FLAGS_RESERVED_LOW); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_REQUEST, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi018.c b/test_pool/pin_control/test_pi018.c new file mode 100644 index 0000000000000000000000000000000000000000..1c27116c8accbe44bdd911af495c3da7b752dace --- /dev/null +++ b/test_pool/pin_control/test_pi018.c @@ -0,0 +1,101 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 18) +#define TEST_DESC "pin ctrl release invalid case check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_query_release_invalid_case_check(void) +{ + int32_t status; + size_t return_value_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_pins = 0; + uint32_t message_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* If PIN CONTROL RELEASE is not supported, skip the test */ + val_print(VAL_PRINT_TEST, "\n [Check 1] PIN CONTROL RELEASE cmd support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_RELEASE; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n PIN CONTROL RELEASE not supported "); + return VAL_STATUS_SKIP; + } + + val_print(VAL_PRINT_TEST, "\n [Check 2] PIN CONTROL RELEASE check for invalid pin ids"); + + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + /* Releaseing control of invalid pin id for an agent*/ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + /* pins 0 to num_pins - 1 are valid, using num_pins as invalid pin */ + parameters[param_count++] = num_pins; + parameters[param_count++] = PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_RELEASE, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Releaseing control of invalid flags for an agent*/ + val_print(VAL_PRINT_TEST, + "\n [Check 3] Query pin control release cmd for invalid flags"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = num_pins - 1; + /* Making reserved bit as 1 to make invalid flag */ + parameters[param_count++] = PIN_SELECTOR + (1 << RELEASE_FLAGS_RESERVED_LOW); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_RELEASE, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi019.c b/test_pool/pin_control/test_pi019.c new file mode 100644 index 0000000000000000000000000000000000000000..65572f0a1285fb226e63016bba7c01d7b8872f9a --- /dev/null +++ b/test_pool/pin_control/test_pi019.c @@ -0,0 +1,193 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 19) +#define TEST_DESC "pin ctrl get name check " +#define PARAMETER_SIZE 2 +#define NO_IDENTIFIERS_FOUND 0x7 + +uint32_t pin_control_query_ext_name_check(void) +{ + int32_t status; + size_t return_value_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_groups = 0, num_pins = 0, num_functions = 0; + uint32_t pc_id = 0; + uint8_t *extended_name; + uint32_t ext_name_sup; + uint32_t run_flag = 0; + uint32_t num_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Query pin control ext name for pin identifiers */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + num_flag = 1 << PIN_SELECTOR; + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + /* Get ext name for each pin identifier*/ + for (pc_id = 0; pc_id < num_pins; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query ext name for pin ids"); + + /* Check if extended name supported for each pin */ + ext_name_sup = val_pin_control_get_ext_name_info(pc_id, PC_PIN_NAME); + if (ext_name_sup == 0) + { + val_print(VAL_PRINT_TEST, "\n Pin doesn't support extended name"); + continue; + } + + run_flag = 1; + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = PIN_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + extended_name = (uint8_t *) &return_values[PIN_CONTROL_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Pin name : %s", extended_name); + } + } + + /* Query pin control ext name for group identifiers */ + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + num_flag = 1 << GROUP_SELECTOR; + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM GROUPS : %d", num_groups); + + /* Get ext name for each group identifier*/ + for (pc_id = 0; pc_id < num_groups; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL GROUP ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Query ext name for group ids"); + + /* Check if extended name supported for each group */ + ext_name_sup = val_pin_control_get_ext_name_info(pc_id, PC_GROUP_NAME); + if (ext_name_sup == 0) + { + val_print(VAL_PRINT_TEST, "\n Group doesn't support extended name"); + continue; + } + + run_flag = 1; + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = GROUP_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + extended_name = (uint8_t *) &return_values[PIN_CONTROL_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Group name : %s", extended_name); + } + } + + /* Query pin control ext name for group identifiers */ + num_functions = val_pin_control_get_info(0, PC_NUM_FUNCTIONS); + if (num_functions == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control function identifiers found"); + num_flag = 1 << FUNCTION_SELECTOR; + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM FUNCTIONS : %d", num_functions); + + /* Get ext name for each function identifier*/ + for (pc_id = 0; pc_id < num_groups; pc_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL FUNCTION ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Query ext name for function ids"); + + /* Check if extended name supported for each function */ + ext_name_sup = val_pin_control_get_ext_name_info(pc_id, PC_FUNCTION_NAME); + if (ext_name_sup == 0) + { + val_print(VAL_PRINT_TEST, "\n Function doesn't support extended name"); + continue; + } + + run_flag = 1; + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id; + parameters[param_count++] = FUNCTION_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + extended_name = (uint8_t *) &return_values[PIN_CONTROL_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Function name : %s", extended_name); + } + } + + /* If no pins/groups/functions are present, skip the test */ + if (num_flag == NO_IDENTIFIERS_FOUND) + { + val_print(VAL_PRINT_ERR, "\n No Pins/Groups/Funtions are present"); + return VAL_STATUS_SKIP; + } + else if (run_flag == 0) + { + val_print(VAL_PRINT_ERR, "\n Pins/Groups/Funtions doesn't support ext name"); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} + diff --git a/test_pool/pin_control/test_pi020.c b/test_pool/pin_control/test_pi020.c new file mode 100644 index 0000000000000000000000000000000000000000..40a8c6a8db1877797d1a52751ad43666ebe4c570 --- /dev/null +++ b/test_pool/pin_control/test_pi020.c @@ -0,0 +1,128 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 20) +#define TEST_DESC "pin ctrl name get invalid case check " +#define PARAMETER_SIZE 2 + +uint32_t pin_control_query_ext_name_get_invalid_case_check(void) +{ + int32_t status; + size_t return_value_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_pins = 0; + uint32_t pc_id; + uint32_t ext_name_sup; + uint32_t run_flags = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Query pin control ext name for invalid identifier */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for invalid identifier"); + + pc_id = val_pin_control_get_info(0, PC_NUM_PINS); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + /* pins 0 to num_pins - 1 are valid, using num_pins as invalid pin */ + parameters[param_count++] = pc_id; + parameters[param_count++] = PIN_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Query pin control ext name for invalid parameters */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for invalid parameter"); + + pc_id = val_pin_control_get_info(0, PC_NUM_PINS); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = pc_id - 1; + /* Making reserved bit as 1 to make invalid flag */ + parameters[param_count++] = PIN_SELECTOR + (1 << REQUEST_FLAGS_RESERVED_LOW); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no pin identifiers found */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + return VAL_STATUS_SKIP; + } + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + /* Check pin control name get for unsupported identifiers */ + for (pc_id = 0; pc_id < num_pins; pc_id++) + { + + /* Check if extended domain name is supported for this pin */ + ext_name_sup = val_pin_control_get_ext_name_info(pc_id, PC_PIN_NAME); + if (ext_name_sup == 1) + continue; + + run_flags = 1; + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pc_id); + val_print(VAL_PRINT_TEST, "\n [Check 3] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = num_pins; + parameters[param_count++] = PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_NAME_GET, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + val_print_return_values(return_value_count, return_values); + } + + if (run_flags == 0) { + val_print(VAL_PRINT_ERR, "\n All identifiers support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi021.c b/test_pool/pin_control/test_pi021.c new file mode 100644 index 0000000000000000000000000000000000000000..edfba380d65d2753f77dcac1b64144e9c2e350ec --- /dev/null +++ b/test_pool/pin_control/test_pi021.c @@ -0,0 +1,282 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 21) +#define TEST_DESC "pin ctrl set permissions check " + +#define PARAMETER_SIZE 3 + +uint32_t pin_control_set_permissions_check(void) +{ + int32_t status; + size_t return_value_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameter[PARAMETER_SIZE]; + uint32_t num_pins, num_groups; + uint32_t attributes = 0; + uint32_t flags, agent_id; + uint32_t pin_id, group_id, message_id; + uint32_t run_test = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + agent_id = val_base_get_info(BASE_TEST_AGENT_ID); + + /* If agent is not trusted , skip the test */ + if (val_check_trusted_agent(agent_id) == 0) { + val_print(VAL_PRINT_ERR, "\n Calling agent is untrusted agent "); + return VAL_STATUS_SKIP; + } + + /* If PINCTRL_SET_PERMISSIONS not supported, skip the test */ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = PIN_CONTROL_SET_PERMISSIONS; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status != SCMI_SUCCESS) { + val_print(VAL_PRINT_ERR, "\n PINCTRL SET PERMISSIONS not supported "); + return VAL_STATUS_SKIP; + } + + /* Check the number of pins */ + num_pins = val_pin_control_get_info(0, PC_NUM_PINS); + if (num_pins == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM PINS : %d", num_pins); + + /* Deny access to pins for given agent */ + for (pin_id = 0; pin_id < num_pins; pin_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL PIN ID: %d", pin_id); + status = val_pinctrl_check_access(agent_id, pin_id, PIN_SELECTOR); + + if (status != SCMI_SUCCESS) { + val_print(VAL_PRINT_DEBUG, "\n Agent don't have access "); + continue; + } + + run_test = 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Deny access to valid pin %d", pin_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = agent_id; + parameter[param_count++] = pin_id; + flags = (PINCTRL_ACCESS_DENY << PINCTRL_ACCESS_OFFSET) + PIN_SELECTOR; + parameter[param_count++] = flags; /* Deny access */ + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_SET_PERMISSIONS, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Agent accessing denied pin should fail */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Access denied pin"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = pin_id; + attributes = (GET_ALL_CONFIGS << GET_ALL_CONFIGS_LOW) + + (PIN_SELECTOR << SELECTOR_LOW); + parameter[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status == SCMI_SUCCESS) { + val_print(VAL_PRINT_ERR, "\n CHECK DENIED PIN ACCESS: FAILED"); + val_print(VAL_PRINT_INFO, "\n Able to access denied pin"); + return VAL_STATUS_FAIL; + } + + if (val_compare_status(status, SCMI_DENIED) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Restore agent access to pin */ + val_print(VAL_PRINT_TEST, "\n [Check 3] Restore denied pin access"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = agent_id; + parameter[param_count++] = pin_id; + flags = (PINCTRL_ACCESS_ALLOW << PINCTRL_ACCESS_OFFSET) + PIN_SELECTOR; + parameter[param_count++] = flags; /* Allow access */ + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_SET_PERMISSIONS, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Agent should be able to access pin after pin permission restored */ + val_print(VAL_PRINT_TEST, "\n [Check 4] Access pin after permissions restored"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = pin_id; + attributes = (GET_ALL_CONFIGS << GET_ALL_CONFIGS_LOW) + + (PIN_SELECTOR << SELECTOR_LOW); + parameter[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + } + + /* Check the number of groups */ + num_groups = val_pin_control_get_info(0, PC_NUM_GROUPS); + if (num_groups == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control group identifiers found"); + } else { + + val_print(VAL_PRINT_DEBUG, "\n NUM GROUP : %d", num_groups); + + /* Deny access to group for given agent */ + for (group_id = 0; group_id < num_groups; group_id++) + { + val_print(VAL_PRINT_TEST, "\n PIN CONTROL GROUP ID: %d", group_id); + status = val_pinctrl_check_access(agent_id, group_id, GROUP_SELECTOR); + + if (status != SCMI_SUCCESS) { + val_print(VAL_PRINT_DEBUG, "\n Agent don't have access "); + continue; + } + + run_test = 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Deny access to valid group %d", group_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = agent_id; + parameter[param_count++] = group_id; + flags = (PINCTRL_ACCESS_DENY << PINCTRL_ACCESS_OFFSET) + GROUP_SELECTOR; + parameter[param_count++] = flags; /* Deny access */ + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_SET_PERMISSIONS, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Agent accessing denied group should fail */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Access denied group"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = group_id; + attributes = (GET_ALL_CONFIGS << GET_ALL_CONFIGS_LOW) + + (GROUP_SELECTOR << SELECTOR_LOW); + parameter[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status == SCMI_SUCCESS) { + val_print(VAL_PRINT_ERR, "\n CHECK DENIED GROUP ACCESS: FAILED"); + val_print(VAL_PRINT_INFO, "\n Able to access denied group"); + return VAL_STATUS_FAIL; + } + + if (val_compare_status(status, SCMI_DENIED) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Restore agent access to group */ + val_print(VAL_PRINT_TEST, "\n [Check 3] Restore denied group access"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = agent_id; + parameter[param_count++] = group_id; + flags = (PINCTRL_ACCESS_ALLOW << PINCTRL_ACCESS_OFFSET) + GROUP_SELECTOR; + parameter[param_count++] = flags; /* Allow access */ + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, PIN_CONTROL_SET_PERMISSIONS, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Agent should be able to access group after group permission restored */ + val_print(VAL_PRINT_TEST, "\n [Check 4] Access group after permissions restored"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameter[param_count++] = group_id; + attributes = (GET_ALL_CONFIGS << GET_ALL_CONFIGS_LOW) + + (GROUP_SELECTOR << SELECTOR_LOW); + parameter[param_count++] = attributes; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_CONFIG_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameter, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + } + if (run_test) + return VAL_STATUS_PASS; + else + return VAL_STATUS_SKIP; +} diff --git a/test_pool/pin_control/test_pi022.c b/test_pool/pin_control/test_pi022.c new file mode 100644 index 0000000000000000000000000000000000000000..24bf06d25eafbe476ff673abe084b650228ff1df --- /dev/null +++ b/test_pool/pin_control/test_pi022.c @@ -0,0 +1,86 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 22) +#define TEST_DESC "pin ctrl set permissions invalid param check " + +#define PARAMETER_SIZE 3 +#define AGENT_ID 0 + +uint32_t pin_control_set_permission_invalid_param_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t pc_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + pc_id = val_pin_control_get_info(0, PC_NUM_PINS); + if (pc_id == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid selector "); + + /* Query with invalid selector should fail with INVALID_PARAMETERS */ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = AGENT_ID; + parameters[param_count++] = 0; + /* Oly Pin/Group is valid, other selectors are invalid */ + parameters[param_count++] = FUNCTION_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_SET_PERMISSIONS, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query with invalid flags"); + + /* Query with invalid attribute should fail with INVALID_PARAMETERS*/ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = AGENT_ID; + parameters[param_count++] = 0; + /* Setting reserved bits, should fail with INVALID_PARAMETERS */ + parameters[param_count++] = 1 << RESERVED_FLAGS_SET_PERM_LOW | PIN_SELECTOR; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_SET_PERMISSIONS, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/pin_control/test_pi023.c b/test_pool/pin_control/test_pi023.c new file mode 100644 index 0000000000000000000000000000000000000000..708434de530b7da9cd1dc90d34139e6c6514b307 --- /dev/null +++ b/test_pool/pin_control/test_pi023.c @@ -0,0 +1,67 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include"val_interface.h" +#include "val_pin_control.h" + +#define TEST_NUM (SCMI_PIN_CONTROL_TEST_NUM_BASE + 23) +#define TEST_DESC "pin ctrl set permissions invalid id check " + +#define PARAMETER_SIZE 3 +#define AGENT_ID 0 + +uint32_t pin_control_set_permission_invalid_id_check(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t pc_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + pc_id = val_pin_control_get_info(0, PC_NUM_PINS); + if (pc_id == 0) { + val_print(VAL_PRINT_ERR, "\n No pin control pin identifiers found"); + } else { + + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid pin id "); + + /* Query with invalid pin id should fail with INVALID_PARAMETERS */ + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = AGENT_ID; + /* pins 0 to pc_id - 1 are valid, using pc_id as invalid pin */ + parameters[param_count++] = pc_id; + parameters[param_count++] = PIN_SELECTOR; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_PIN_CONTROL, + PIN_CONTROL_SET_PERMISSIONS, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/power_domain/test_p005_v3_1.c b/test_pool/power_domain/test_p005_v3_1.c new file mode 100644 index 0000000000000000000000000000000000000000..d97d49bf475a5068dc18d69ac5d0d1cd2fe824d1 --- /dev/null +++ b/test_pool/power_domain/test_p005_v3_1.c @@ -0,0 +1,89 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_power_domain.h" + +#define TEST_NUM (SCMI_POWER_DOMAIN_TEST_NUM_BASE + 5) +#define TEST_DESC "Power domain attributes check " + +uint32_t power_domain_query_domain_attributes_scmi_v3_1(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, attribute; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + num_domains = val_power_domain_get_info(0, NUM_POWER_DOMAIN); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No power domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check power domain attributes for valid domain */ + val_print(VAL_PRINT_TEST, "\n POWER DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query power domain attribute"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWER_DOMAIN, POWER_DOMAIN_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attribute = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attribute, 0, 28)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_DEBUG, "\n POWER STATE CHANGE NOTIFICATIONS SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 31, 31)); + val_print(VAL_PRINT_DEBUG, "\n POWER ASYNCHRONOUS SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 30, 30)); + val_print(VAL_PRINT_DEBUG, "\n POWER SYNCHRONOUS SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 29, 29)); + val_print(VAL_PRINT_DEBUG, "\n POWER STATE CHANGE REQUESTED NOTIFICATIONS SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 28, 28)); + + val_print(VAL_PRINT_DEBUG, "\n POWER EXTENDED DOMAIN NAME SUPPORT: %d", + VAL_EXTRACT_BITS(attribute, 27, 27)); + val_power_domain_save_info(PD_EXT_DOMAIN_NAME_SUPP, domain_id, + VAL_EXTRACT_BITS(attribute, 27, 27)); + + val_print(VAL_PRINT_DEBUG, "\n DOMAIN NAME: %s", + (uint8_t *)&return_values[DOMAIN_NAME_OFFSET]); + } + + return VAL_STATUS_PASS; + +} diff --git a/test_pool/power_domain/test_p017.c b/test_pool/power_domain/test_p017.c new file mode 100644 index 0000000000000000000000000000000000000000..3a1933b1127e7ac99797ee2af903f588deeb0b4c --- /dev/null +++ b/test_pool/power_domain/test_p017.c @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_power_domain.h" + +#define TEST_NUM (SCMI_POWER_DOMAIN_TEST_NUM_BASE + 17) +#define TEST_DESC "Power domain extended name get check " + +uint32_t power_query_ext_domain_name(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint8_t *extended_name; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_power_domain_get_info(0, NUM_POWER_DOMAIN); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No power domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Power domain name for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWER DOMAIN ID : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query extended domain name"); + + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_power_domain_get_info(domain_id, PD_EXT_DOMAIN_NAME_SUPP); + if (extended_name_supp != PD_EXTENDED_DOMAIN_NAME) + { + val_print(VAL_PRINT_ERR, "\n Domain doesn't support extended name"); + continue; + } + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWER_DOMAIN, POWER_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + extended_name = (uint8_t *) &return_values[PW_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Power Domain name : %s", extended_name); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/power_domain/test_p018.c b/test_pool/power_domain/test_p018.c new file mode 100644 index 0000000000000000000000000000000000000000..6d486d2afed873d57987d53f004a0ad26ac02307 --- /dev/null +++ b/test_pool/power_domain/test_p018.c @@ -0,0 +1,99 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_power_domain.h" + +#define TEST_NUM (SCMI_POWER_DOMAIN_TEST_NUM_BASE + 18) +#define TEST_DESC "Power get extended name for invalid domain " + +uint32_t power_query_ext_domain_name_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t extended_name_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get Extended name for invalid domain */ + domain_id = val_power_domain_get_info(0, NUM_POWER_DOMAIN) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWER_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no domains found*/ + num_domains = val_power_domain_get_info(0, NUM_POWER_DOMAIN); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Power domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Power domain name for unsupported domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_power_domain_get_info(domain_id, PD_EXT_DOMAIN_NAME_SUPP); + + if (extended_name_supp == PD_EXTENDED_DOMAIN_NAME) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n POWER DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWER_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/Makefile b/test_pool/powercap/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4d2124d67c43c636829d8b0d9849bd3de672de7c --- /dev/null +++ b/test_pool/powercap/Makefile @@ -0,0 +1,18 @@ +#/** @file +# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. +# * SPDX-License-Identifier : Apache-2.0 +# * +# * Licensed under the Apache License, Version 2.0 (the "License"); +# * you may not use this file except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +#**/ + +include ${TOP}/test_pool/build_protocol.mk diff --git a/test_pool/powercap/test_pc001.c b/test_pool/powercap/test_pc001.c new file mode 100644 index 0000000000000000000000000000000000000000..c16cd3ad5ca00394914f2876d4ef52b7e3b80b54 --- /dev/null +++ b/test_pool/powercap/test_pc001.c @@ -0,0 +1,62 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_base.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 1) +#define TEST_DESC "Powercap protocol version check " +#define RETURN_VALUE_COUNT 1 + +uint32_t powercap_query_protocol_version(uint32_t *version) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t *parameters; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Query the implemented protocol version of powercap protocol */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query protocol version"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters = NULL; /* No parameters for this command */ + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_VERSION, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (return_value_count != RETURN_VALUE_COUNT) + return VAL_STATUS_FAIL; + + *version = return_values[VERSION_OFFSET]; + val_print(VAL_PRINT_ERR, "\n PROTOCOL VERSION : 0x%08x ", version); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc002.c b/test_pool/powercap/test_pc002.c new file mode 100644 index 0000000000000000000000000000000000000000..8c6f6372f3ed48dfb4716a21a1983447b7ce42c4 --- /dev/null +++ b/test_pool/powercap/test_pc002.c @@ -0,0 +1,74 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 2) +#define TEST_DESC "Powercap protocol attributes check " + +#define RETURN_VALUE_COUNT 1 + +uint32_t powercap_query_protocol_attributes(void) +{ + size_t param_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t return_value_count; + int32_t status; + uint32_t *parameters; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t attributes, num_domains; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Query Powercap protocol and check for number of domains */ + val_print(VAL_PRINT_TEST, "\n [Check1] Query Protocol attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters = NULL; /* No parameters for this command */ + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 16, 31) != VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + if (val_compare_return_count(return_value_count, RETURN_VALUE_COUNT)) + return VAL_STATUS_FAIL; + + /* Save the number of returned powercap domains. */ + num_domains = VAL_EXTRACT_BITS(attributes, 0, 15); + + if (val_compare("NUM DOMAINS", num_domains, val_powercap_get_expected_num_domains())) + return VAL_STATUS_FAIL; + + val_powercap_save_info(NUM_POWERCAP_DOMAINS, 0x0, num_domains); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc003.c b/test_pool/powercap/test_pc003.c new file mode 100644 index 0000000000000000000000000000000000000000..20a6a177003934e985ee8a3ed2f31fd1bb27d18d --- /dev/null +++ b/test_pool/powercap/test_pc003.c @@ -0,0 +1,91 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 3) +#define TEST_DESC "Powercap msg attributes mandatory cmd check " + +uint32_t powercap_query_mandatory_command_support(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t attributes; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Mandatory cmd POWERCAP_DOMAIN_ATTRIBUTES should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] POWERCAP DOMAIN ATTRIBUTES support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_DOMAIN_ATTRIBUTES; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 1, 31) != VAL_STATUS_PASS)) + return VAL_STATUS_FAIL; + + /* Check Fast channel support for CAP_GET, CAP_SET, PAI_SET and PAI_GET*/ + for (message_id = POWERCAP_CAP_GET; message_id <= POWERCAP_PAI_SET; message_id++) + { + val_print(VAL_PRINT_TEST, "\n [Check 2] FASTCHANNEL support for MSG : %d ", + message_id); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 1, 31)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_DEBUG, "\n MESSAGE FASTCH SUPPORT : %d ", + VAL_EXTRACT_BITS(attributes, 0, 0)); + val_powercap_save_info(POWERCAP_MSG_FAST_CHNL_SUPP, message_id, + VAL_EXTRACT_BITS(attributes, 0, 0)); + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc004.c b/test_pool/powercap/test_pc004.c new file mode 100644 index 0000000000000000000000000000000000000000..02110378e8fd379b9fc773a54c1681b5e5601307 --- /dev/null +++ b/test_pool/powercap/test_pc004.c @@ -0,0 +1,75 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 4) +#define TEST_DESC "Powercap msg attributes invalid msg id check " + +uint32_t powercap_invalid_messageid_call(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t *parameters; + uint32_t message_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Sending invalid powercap protocol cmd should fail */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Invalid command invocation"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters = NULL; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_INVALID_COMMAND, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Query support for invalid powercap protocol command should return status NOT_FOUND */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Query undefined command support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_INVALID_COMMAND; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc005.c b/test_pool/powercap/test_pc005.c new file mode 100644 index 0000000000000000000000000000000000000000..9e4c2ac45240448d68a04f0ca84b622baf327b6b --- /dev/null +++ b/test_pool/powercap/test_pc005.c @@ -0,0 +1,140 @@ +/** @file + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define NAME_OFFSET 1 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 5) +#define TEST_DESC "Powercap domain attributes check " + +uint32_t powercap_query_domain_attributes(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, attributes; + uint32_t min_pai, max_pai, pai_step; + uint32_t min_power_cap, max_power_cap, power_cap_step, ext_name_supp; + uint32_t sustainable_power, accuracy, parent_id; + char *name; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap domain attributes for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, + POWERCAP_DOMAIN_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + val_powercap_save_info(POWERCAP_ATTRIBUTES, domain_id, attributes); + + /* Extract powercap domain attributes */ + val_print(VAL_PRINT_DEBUG, "\n PC change notify supp : %d", + val_get_powercap_attributes_flag(attributes, PC_CHANGE_NOTIFY_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC measure change notify supp : %d", + val_get_powercap_attributes_flag(attributes, PC_MEASUR_CHANG_NOTIFY_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n Async PC set supp : %d", + val_get_powercap_attributes_flag(attributes, PC_ASYNC_PC_SET_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n Extended PC name supp : %d", + val_get_powercap_attributes_flag(attributes, PC_EXTENDED_NAME)); + val_print(VAL_PRINT_DEBUG, "\n PC config supp : %d", + val_get_powercap_attributes_flag(attributes, PC_CONFIG_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC power monitor supp : %d", + val_get_powercap_attributes_flag(attributes, PC_POWER_MONITOR_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC PAI config supp : %d", + val_get_powercap_attributes_flag(attributes, PC_PAI_CONFIG_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC power unit : %d", + val_get_powercap_attributes_flag(attributes, PC_POWER_UNIT)); + val_print(VAL_PRINT_DEBUG, "\n PC fast channel supp : %d", + val_get_powercap_attributes_flag(attributes, PC_FASTCHANNEL_SUPPORT)); + + ext_name_supp = val_get_powercap_attributes_flag(attributes, PC_EXTENDED_NAME); + name = (char *)val_powercap_get_expected_name(domain_id); + + /* Domain name */ + if (ext_name_supp) { + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + name + strnlen(name, SCMI_NAME_STR_SIZE) - 16, SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } else { + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + name, SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } + + /* PAI values */ + min_pai = return_values[MIN_PAI_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Min PAI : %d", min_pai); + max_pai = return_values[MAX_PAI_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Max PAI : %d", max_pai); + pai_step = return_values[PAI_STEP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n PAI step : %d", pai_step); + + /* Power capping values */ + min_power_cap = return_values[MIN_POWER_CAP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Min power capping : %d", min_power_cap); + val_powercap_save_info(POWERCAP_MIN_POWER, domain_id, min_power_cap); + + max_power_cap = return_values[MAX_POWER_CAP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Max power capping : %d", max_power_cap); + val_powercap_save_info(POWERCAP_MAX_POWER, domain_id, max_power_cap); + + power_cap_step = return_values[POWER_CAP_STEP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n power capping step : %d", power_cap_step); + + sustainable_power = return_values[SUSTAINAIBLE_POWER_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Sustainable power : %d", sustainable_power); + + accuracy = return_values[ACCURACY_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Accuracy : %d", accuracy); + + parent_id = return_values[PARENT_ID_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Parent ID : %d", parent_id); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc005_v2.c b/test_pool/powercap/test_pc005_v2.c new file mode 100644 index 0000000000000000000000000000000000000000..0a43724b503a1f867ff7b42a0ec146c273f3e91b --- /dev/null +++ b/test_pool/powercap/test_pc005_v2.c @@ -0,0 +1,184 @@ +/** @file + * Copyright (c) 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define NAME_OFFSET 1 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 5) +#define TEST_DESC "Powercap domain attributes check " + +uint32_t powercap_query_domain_attributes_v2(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t power_monitor, powercap_config, power_unit; + uint32_t domain_id, num_domains, attributes; + uint32_t min_pai, max_pai, pai_step; + uint32_t min_power_cap, max_power_cap, power_cap_step, ext_name_supp; + uint32_t sustainable_power, accuracy, parent_id; + char *name; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap domain attributes for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, + POWERCAP_DOMAIN_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + val_powercap_save_info(POWERCAP_ATTRIBUTES, domain_id, attributes); + + /* Extract powercap domain attributes */ + val_print(VAL_PRINT_DEBUG, "\n PC change notify supp : %d", + val_get_powercap_attributes_flag(attributes, PC_CHANGE_NOTIFY_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC measure change notify supp : %d", + val_get_powercap_attributes_flag(attributes, PC_MEASUR_CHANG_NOTIFY_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n Async PC set supp : %d", + val_get_powercap_attributes_flag(attributes, PC_ASYNC_PC_SET_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n Async PC set supp : %d", + val_get_powercap_attributes_flag(attributes, PC_EXTENDED_NAME)); + val_print(VAL_PRINT_DEBUG, "\n PC config supp : %d", + val_get_powercap_attributes_flag(attributes, PC_CONFIG_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC power monitor supp : %d", + val_get_powercap_attributes_flag(attributes, PC_POWER_MONITOR_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC PAI config supp : %d", + val_get_powercap_attributes_flag(attributes, PC_PAI_CONFIG_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n PC power unit : %d", + val_get_powercap_attributes_flag(attributes, PC_POWER_UNIT)); + val_print(VAL_PRINT_DEBUG, "\n PC fast channel supp : %d", + val_get_powercap_attributes_flag(attributes, PC_FASTCHANNEL_SUPPORT)); + + power_monitor = val_get_powercap_attributes_flag(attributes, PC_POWER_MONITOR_SUPP); + powercap_config = val_get_powercap_attributes_flag(attributes, PC_PAI_CONFIG_SUPP); + + /* Powercap Monitor and Config both cannot be zero at the same time */ + if (powercap_config == 0 && power_monitor == 0) { + val_print(VAL_PRINT_ERR, "\n Power Monitor and Config both cannot be zero"); + return VAL_STATUS_FAIL; + } + + power_unit = val_get_powercap_attributes_flag(attributes, PC_POWER_UNIT); + /* Power Unit value must be less than 0x3 */ + if (power_unit > 0x2) { + val_print(VAL_PRINT_DEBUG, "\n PC power unit : %d", power_unit); + val_print(VAL_PRINT_ERR, "\n Power Unit must be less than 0x3"); + return VAL_STATUS_FAIL; + } + + ext_name_supp = val_get_powercap_attributes_flag(attributes, PC_EXTENDED_NAME); + name = (char *)val_powercap_get_expected_name(domain_id); + + /* Domain name */ + if (ext_name_supp) { + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + name + strnlen(name, SCMI_NAME_STR_SIZE) - 16, SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } else { + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + name, SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } + + /* PAI values */ + min_pai = return_values[MIN_PAI_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Min PAI : %d", min_pai); + max_pai = return_values[MAX_PAI_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Max PAI : %d", max_pai); + pai_step = return_values[PAI_STEP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n PAI step : %d", pai_step); + + /* Both MIN and MAX PAI cannot be zero */ + if (min_pai == 0 || max_pai == 0) { + val_print(VAL_PRINT_ERR, "\n MIN PAI and MAX PAI must not be zero"); + return VAL_STATUS_FAIL; + } + + /* PAI STEP must be non zero if min and max pai value differs */ + if (min_pai != max_pai && pai_step == 0) { + val_print(VAL_PRINT_ERR, "\n PAI step must not be 0 if MIN and MAX pai differs"); + return VAL_STATUS_FAIL; + } + + + /* Power capping values */ + min_power_cap = return_values[MIN_POWER_CAP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Min power capping : %d", min_power_cap); + val_powercap_save_info(POWERCAP_MIN_POWER, domain_id, min_power_cap); + + max_power_cap = return_values[MAX_POWER_CAP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Max power capping : %d", max_power_cap); + val_powercap_save_info(POWERCAP_MAX_POWER, domain_id, max_power_cap); + + power_cap_step = return_values[POWER_CAP_STEP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n power capping step : %d", power_cap_step); + + /* Both MIN and MAX POWER CAP cannot be zero */ + if (min_power_cap == 0 || max_power_cap == 0) { + val_print(VAL_PRINT_ERR, "\n MIN and MAX power cap must not be zero"); + return VAL_STATUS_FAIL; + } + + /* POWERCAP STEP must be non zero if min and max powercap value differs */ + if (min_power_cap != max_power_cap && power_cap_step == 0) { + val_print(VAL_PRINT_ERR, "\n Non zero power cap step if MIN and MAX cap differ"); + return VAL_STATUS_FAIL; + } + + + sustainable_power = return_values[SUSTAINAIBLE_POWER_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Sustainable power : %d", sustainable_power); + + accuracy = return_values[ACCURACY_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Accuracy : %d", accuracy); + + parent_id = return_values[PARENT_ID_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Parent ID : %d", parent_id); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc006.c b/test_pool/powercap/test_pc006.c new file mode 100644 index 0000000000000000000000000000000000000000..7fdd99c6d9bbb6243ae8e097c63f9f1d7a0173df --- /dev/null +++ b/test_pool/powercap/test_pc006.c @@ -0,0 +1,56 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 6) +#define TEST_DESC "Powercap Domain attributes invalid domain id check " + +uint32_t powercap_query_domain_attributes_invalid_id(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + + /* Check powercap domain attributes for invalid domain */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes for invalid domain_id: %d", + domain_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DOMAIN_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc007.c b/test_pool/powercap/test_pc007.c new file mode 100644 index 0000000000000000000000000000000000000000..caaa30107ab3512bf1c9458e3f84bd3cd8bc8929 --- /dev/null +++ b/test_pool/powercap/test_pc007.c @@ -0,0 +1,73 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 7) +#define TEST_DESC "Powercap domain get value check " + +uint32_t powercap_query_get_powercap_value(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t powercap; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap value for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + powercap = return_values[POWERCAP_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Power cap : %d", powercap); + + val_powercap_save_info(POWERCAP_POWERCAP, domain_id, powercap); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc008.c b/test_pool/powercap/test_pc008.c new file mode 100644 index 0000000000000000000000000000000000000000..a44c68d7d65fdd26cfd0b1f3a647e5a2810aa1d6 --- /dev/null +++ b/test_pool/powercap/test_pc008.c @@ -0,0 +1,55 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 8) +#define TEST_DESC "Powercap invalid domain id check " + +uint32_t powercap_query_invalid_domain_id(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t powercap_domain_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check Check Powercap value for invalid domain */ + powercap_domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid powercap id: %d", + powercap_domain_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_GET, COMMAND_MSG); + param_count++; + val_send_message(cmd_msg_hdr, param_count, &powercap_domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc009.c b/test_pool/powercap/test_pc009.c new file mode 100644 index 0000000000000000000000000000000000000000..4ea09d320a7edceaf1bf8077fdba416a03caa0b8 --- /dev/null +++ b/test_pool/powercap/test_pc009.c @@ -0,0 +1,172 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 9) +#define TEST_DESC "Powercap set value check " + +#define PARAMETER_SIZE 3 + +/********* TEST ALGO ******************** + * Check for Power cap DOMAINS + * Set Powercap synchronously and expect delayed response + * Set Powercap synchronously and ignore delayed response + * Set Powercap asynchronously and ignore delayed response + * Set Powercap asynchronously and expect delayed response + * Wait for delayed response POWERCAP_CAP_SET_COMPLETE +*****************************************/ + +uint32_t powercap_set_power_cap_value(void) +{ + size_t param_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t return_value_count; + int32_t status; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains; + uint32_t domain_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no powercaps domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Set Powercap value for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + + /* Step 1 : Set Powercap synchronously and expect delayed response */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Set Powercap [Sync + Delay]"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status) + parameters[param_count++] = domain_id; + parameters[param_count++] = val_get_cap_set_flag(PC_CAP_SET_SYNC, PC_CAP_SET_EXPECT); + parameters[param_count++] = val_powercap_get_info(POWERCAP_POWERCAP, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Step 2 : Set Powercap synchronously and ignore delayed response */ + val_print(VAL_PRINT_TEST, "\n [Check 2] Set Powercap [Sync + Ignore]"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status) + parameters[param_count++] = domain_id; + parameters[param_count++] = val_get_cap_set_flag(PC_CAP_SET_SYNC, PC_CAP_SET_IGNORE); + parameters[param_count++] = val_powercap_get_info(POWERCAP_POWERCAP, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Step 3 : Set Powercap asynchronously and ignore delayed response */ + val_print(VAL_PRINT_TEST, "\n [Check 3] Set Powercap [Async + Ignore]"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status) + parameters[param_count++] = domain_id; + parameters[param_count++] = val_get_cap_set_flag(PC_CAP_SET_ASYNC, PC_CAP_SET_IGNORE); + parameters[param_count++] = val_powercap_get_info(POWERCAP_POWERCAP, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Step 4 : Set Powercap asynchronously and expect delayed response */ + val_print(VAL_PRINT_TEST, "\n [Check 4] Set Powercap [Async + Expect]"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status) + parameters[param_count++] = domain_id; + parameters[param_count++] = val_get_cap_set_flag(PC_CAP_SET_ASYNC, PC_CAP_SET_EXPECT); + parameters[param_count++] = val_powercap_get_info(POWERCAP_POWERCAP, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Wait for delayed response POWERCAP_CAP_SET_COMPLETE*/ + val_print(VAL_PRINT_TEST, "\n [Check 5] Wait for async delayed response"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + val_receive_delayed_response(&rsp_msg_hdr, &status, &return_value_count, return_values); + + val_print(VAL_PRINT_TEST, "\n NOTIFY MSG HDR : 0x%08x", rsp_msg_hdr); + if (val_compare("PROTOCOL ID", VAL_EXTRACT_BITS(rsp_msg_hdr, 10, 17), + PROTOCOL_CLOCK)) + return VAL_STATUS_FAIL; + if (val_compare("MSG TYPE ", VAL_EXTRACT_BITS(rsp_msg_hdr, 8, 9), + DELAYED_RESPONSE_MSG)) + return VAL_STATUS_FAIL; + if (val_compare("MSG ID ", VAL_EXTRACT_BITS(rsp_msg_hdr, 0, 7), + CLOCK_RATE_SET_COMPLETE)) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Compare send & received powercap values */ + if (val_compare("Domain ID ", + domain_id, return_values[DELAYED_RESP_DOMAIN_ID_OFFSET])) + return VAL_STATUS_FAIL; + + if (val_compare("POWERCAP ", + val_powercap_get_info(POWERCAP_POWERCAP, domain_id), + return_values[DELAYED_RESP_POWER_CAP_OFFSET])) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc010.c b/test_pool/powercap/test_pc010.c new file mode 100644 index 0000000000000000000000000000000000000000..8eafd83e0aea6475b141e913b9a3e95e592d423f --- /dev/null +++ b/test_pool/powercap/test_pc010.c @@ -0,0 +1,63 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 3 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 10) +#define TEST_DESC "Powercap set value invalid id " + +uint32_t powercap_invalid_domain_set_power_cap_value(void) +{ + size_t param_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t return_value_count; + int32_t status; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + + /* Set default powercap value for invalid domain. */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Set powercap for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x0; + parameters[param_count++] = 0x0; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc011.c b/test_pool/powercap/test_pc011.c new file mode 100644 index 0000000000000000000000000000000000000000..68a34da90d538885076db5357cfbf52c3406102a --- /dev/null +++ b/test_pool/powercap/test_pc011.c @@ -0,0 +1,89 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 3 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 11) +#define TEST_DESC "Powercap set power cap invalid values " + +uint32_t powercap_invalid_data_set_power_cap_value(void) +{ + size_t param_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t return_value_count; + int32_t status; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Set ZERO Power cap value for valid domain */ + if (val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + domain_id = 0; + + val_print(VAL_PRINT_TEST, "\n [Check 1] Set ZERO power cap for valid domain"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x0; + parameters[param_count++] = 0x0; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Set invalid reserved flags */ + domain_id = 0; + + val_print(VAL_PRINT_TEST, "\n [Check 2] Set non ZERO flags for valid domain"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x7; + parameters[param_count++] = val_powercap_get_info(POWERCAP_POWERCAP, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc012.c b/test_pool/powercap/test_pc012.c new file mode 100644 index 0000000000000000000000000000000000000000..07069e0a16dc6c01ed3163f2d54b3ab1364db322 --- /dev/null +++ b/test_pool/powercap/test_pc012.c @@ -0,0 +1,73 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 12) +#define TEST_DESC "Powercap domain get PAI value check " + +uint32_t powercap_query_get_pai_value(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t pai; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap value for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PAI_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + pai = return_values[PAI_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n PAI : %d", pai); + + val_powercap_save_info(POWERCAP_PAI, domain_id, pai); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc013.c b/test_pool/powercap/test_pc013.c new file mode 100644 index 0000000000000000000000000000000000000000..3925bcd427c9be2499192c07748c867698afae6d --- /dev/null +++ b/test_pool/powercap/test_pc013.c @@ -0,0 +1,55 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 13) +#define TEST_DESC "Powercap invalid domain id pai check " + +uint32_t powercap_query_pai_invalid_domain_id(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t powercap_domain_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check Check PAI value for invalid domain */ + powercap_domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query with invalid powercap id: %d", + powercap_domain_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PAI_GET, COMMAND_MSG); + param_count++; + val_send_message(cmd_msg_hdr, param_count, &powercap_domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc014.c b/test_pool/powercap/test_pc014.c new file mode 100644 index 0000000000000000000000000000000000000000..6748a0582cd41205c114a63d2d9e6dadc2c78a02 --- /dev/null +++ b/test_pool/powercap/test_pc014.c @@ -0,0 +1,75 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 14) +#define TEST_DESC "Powercap set value check " + +#define PARAMETER_SIZE 3 + +uint32_t powercap_set_pai_value(void) +{ + size_t param_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t return_value_count; + int32_t status; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains; + uint32_t domain_id = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no powercaps domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Set pai value for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Set Pai value"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status) + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x0; + parameters[param_count++] = val_powercap_get_info(POWERCAP_PAI, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PAI_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc015.c b/test_pool/powercap/test_pc015.c new file mode 100644 index 0000000000000000000000000000000000000000..d376bce8f6e31acce9c5c93c0d0a8f3eb851316e --- /dev/null +++ b/test_pool/powercap/test_pc015.c @@ -0,0 +1,63 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 3 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 15) +#define TEST_DESC "Powercap set pai invalid id " + +uint32_t powercap_invalid_domain_set_pai_value(void) +{ + size_t param_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t return_value_count; + int32_t status; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + + /* Set default powercap value for invalid domain. */ + val_print(VAL_PRINT_TEST, "\n [Check 1] Set pai for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x0; + parameters[param_count++] = 0x0; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PAI_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc016.c b/test_pool/powercap/test_pc016.c new file mode 100644 index 0000000000000000000000000000000000000000..6f410de2c56b0cf0c8e40f546956e0b06fafd515 --- /dev/null +++ b/test_pool/powercap/test_pc016.c @@ -0,0 +1,89 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 3 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 16) +#define TEST_DESC "Powercap set pai invalid values " + +uint32_t powercap_invalid_data_set_pai_value(void) +{ + size_t param_count; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t return_value_count; + int32_t status; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Set ZERO PAI value for valid domain */ + if (val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + domain_id = 0; + + val_print(VAL_PRINT_TEST, "\n [Check 1] Set ZERO PAI for valid domain"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x0; + parameters[param_count++] = 0x0; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PAI_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Set invalid reserved flags */ + domain_id = 0; + + val_print(VAL_PRINT_TEST, "\n [Check 2] Set non ZERO flags for valid domain"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = 0x7; + parameters[param_count++] = val_powercap_get_info(POWERCAP_PAI, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PAI_SET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc017.c b/test_pool/powercap/test_pc017.c new file mode 100644 index 0000000000000000000000000000000000000000..f892ea5aee41e66b674233e5499ebae3acd125ae --- /dev/null +++ b/test_pool/powercap/test_pc017.c @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 17) +#define TEST_DESC "Powercap domain name get check " + +uint32_t powercap_query_domain_name(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint8_t *extended_name; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap domain name for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query extended domain name"); + + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_get_domain_powercap_attribute(domain_id, PC_EXTENDED_NAME); + if (extended_name_supp != PC_EXTENDED_DOMAIN_NAME) + { + val_print(VAL_PRINT_ERR, "\n Domain doesn't support extended name"); + continue; + } + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + extended_name = (uint8_t *) &return_values[PC_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Power cap name : %s", extended_name); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc018.c b/test_pool/powercap/test_pc018.c new file mode 100644 index 0000000000000000000000000000000000000000..9765848a743276cf535d7748bc7560967f9e9caf --- /dev/null +++ b/test_pool/powercap/test_pc018.c @@ -0,0 +1,99 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 18) +#define TEST_DESC "Powercap get name for invalid domain " + +uint32_t powercap_query_domain_name_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t extended_name_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get Extended name for invalid domain */ + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap domain name for unsupported domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_get_domain_powercap_attribute(domain_id, PC_EXTENDED_NAME); + + if (extended_name_supp == PC_EXTENDED_DOMAIN_NAME) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc019.c b/test_pool/powercap/test_pc019.c new file mode 100644 index 0000000000000000000000000000000000000000..870b0c7a577d663de2e2394e6c14a5b9159d06df --- /dev/null +++ b/test_pool/powercap/test_pc019.c @@ -0,0 +1,91 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 19) +#define TEST_DESC "Powercap domain measurement get check " + +uint32_t powercap_query_measurement(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t power, pai; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap domain measurements for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query measurements"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_MEASUREMENTS_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + power = return_values[MSR_POWER_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Average power consumption : %d", power); + + pai = return_values[MSR_PAI_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n Power averaging interval : %d", pai); + } + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query measurements for invalid domain"); + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_MEASUREMENTS_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc020.c b/test_pool/powercap/test_pc020.c new file mode 100644 index 0000000000000000000000000000000000000000..7d27401430e0c845ca97953da4e72e8de1e8713e --- /dev/null +++ b/test_pool/powercap/test_pc020.c @@ -0,0 +1,108 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 2 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 20) +#define TEST_DESC "Powercap cap changed notification cmd check " + +uint32_t powercap_cap_notification_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t num_domains, domain_id; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if POWERCAP_CAP_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] POWERCAP_CAP_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_CAP_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_CAP_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap or PAI changes for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query CAP Notify"); + if (val_get_domain_powercap_attribute(domain_id, PC_CHANGE_NOTIFY_SUPP) == + PC_NOTIFY_NOT_SUPP) { + val_print(VAL_PRINT_ERR, "\n Domain doesn't support CAP notify"); + continue; + } + + run_flag = 1; + + val_get_domain_powercap_attribute(domain_id, PC_CHANGE_NOTIFY_SUPP); + val_print(VAL_PRINT_TEST, "\n [Check 3] Query CAP Notify"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = PC_NOTIFY_NOT_SUPP; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_NOTIFY, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No power domain support CAP Notify"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc021.c b/test_pool/powercap/test_pc021.c new file mode 100644 index 0000000000000000000000000000000000000000..42d6ac84c82449ffbb21f2ce3b7b043e8ccd3e7c --- /dev/null +++ b/test_pool/powercap/test_pc021.c @@ -0,0 +1,81 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 2 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 21) +#define TEST_DESC "Powercap cap changed notification invalid cmd check " + +uint32_t powercap_cap_notification_invalid_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t domain_id; + uint32_t parameters[PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if POWERCAP_CAP_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] POWERCAP_CAP_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_CAP_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_CAP_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + /* query power cap nitification for invalid domain ID*/ + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + + val_print(VAL_PRINT_TEST, "\n [Check 2] Query CAP Notify for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = PC_NOTIFY_NOT_SUPP; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_CAP_NOTIFY, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc022.c b/test_pool/powercap/test_pc022.c new file mode 100644 index 0000000000000000000000000000000000000000..487fa56507785b2181264e9be062043011b7d943 --- /dev/null +++ b/test_pool/powercap/test_pc022.c @@ -0,0 +1,93 @@ +/** @file + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 4 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 22) +#define TEST_DESC "Powercap measurement changed notification cmd check " + +uint32_t powercap_measurement_notification_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t num_domains, domain_id; + uint32_t parameters[PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if POWERCAP_MEASUREMENTS_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] POWERCAP_MEASUREMENTS_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_MEASUREMENTS_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_MEASUREMENTS_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + /* Skip if no domains found*/ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Powercap domain measurements for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Query Measurements Notify"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = PC_NOTIFY_NOT_SUPP; + parameters[param_count++] = val_powercap_get_info(POWERCAP_MIN_POWER, domain_id); + parameters[param_count++] = val_powercap_get_info(POWERCAP_MAX_POWER, domain_id); + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, + POWERCAP_MEASUREMENTS_NOTIFY, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc023.c b/test_pool/powercap/test_pc023.c new file mode 100644 index 0000000000000000000000000000000000000000..094968b075987b0b1b71ddd89c941f5d5a21bf1b --- /dev/null +++ b/test_pool/powercap/test_pc023.c @@ -0,0 +1,81 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define PARAMETER_SIZE 4 + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 23) +#define TEST_DESC "Powercap measurement changed notification invalid cmd check " + +uint32_t powercap_measurement_notification_invalid_query(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t message_id; + uint32_t domain_id; + uint32_t parameters[PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Check if POWERCAP_MEASUREMENTS_NOTIFY is supported */ + val_print(VAL_PRINT_TEST, "\n [Check 1] POWERCAP_MEASUREMENTS_NOTIFY support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_MEASUREMENTS_NOTIFY; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + /* Skip test case if not-supported. */ + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_MEASUREMENTS_NOTIFY not supported "); + return VAL_STATUS_SKIP; + } + + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 2] Query Measurements Notify for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + + parameters[param_count++] = domain_id; + parameters[param_count++] = PC_NOTIFY_NOT_SUPP; + parameters[param_count++] = 0x0; + parameters[param_count++] = 0x0; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_MEASUREMENTS_NOTIFY, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc024.c b/test_pool/powercap/test_pc024.c new file mode 100644 index 0000000000000000000000000000000000000000..b2c556a23d768afd3058914d0306dd6e9c88056f --- /dev/null +++ b/test_pool/powercap/test_pc024.c @@ -0,0 +1,138 @@ +/** @file + * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 24) +#define TEST_DESC "Powercap describe fast channel check " + +#define PARAMETER_COUNT 2 + +uint32_t powercap_query_describe_fast_channel(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, message_id, attributes; + uint32_t parameters[PARAMETER_COUNT]; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if describe fast channel is not supported*/ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query powercap describe fast channel support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_DESCRIBE_FASTCHANNEL; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_DESCRIBE_FASTCHANNEL not supported "); + return VAL_STATUS_SKIP; + } + + /* Check powercap describe fast channel for valid domain */ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check if domain has fastchannel support. */ + if (val_get_domain_powercap_attribute(domain_id, PC_FASTCHANNEL_SUPPORT) == + PC_FASTCHANNEL_NOT_SUPP) + continue; + + for (message_id = POWERCAP_CAP_GET; message_id <= POWERCAP_PAI_SET; message_id++) + { + /* Check if this message has fastchannel support */ + if (val_powercap_get_info(POWERCAP_MSG_FAST_CHNL_SUPP, message_id) == 0) + continue; + run_flag = 1; + + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN ID:%d and msg_id: %d", + domain_id, message_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Query describe fast channel"); + + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = message_id; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DESCRIBE_FASTCHANNEL, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attributes = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attributes, 3, 31)) != + VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_TEST, "\n DOORBELL SUPPORT :%d", + VAL_EXTRACT_BITS(attributes, 0, 0)); + val_print(VAL_PRINT_TEST, "\n DOORBELL DATA WIDTH :%d", + VAL_EXTRACT_BITS(attributes, 1, 2)); + + val_print(VAL_PRINT_TEST, "\n FAST CH RATE LIMIT :%d", + return_values[FAST_CH_RATE_LIMIT_OFFSET]); + val_print(VAL_PRINT_TEST, "\n FAST CH ADDR LOW :%d", + return_values[CHAN_ADDR_LOW_OFFSET]); + val_print(VAL_PRINT_TEST, "\n FAST CH ADDR HIGH :%d", + return_values[CHAN_ADDR_HIGH_OFFSET]); + val_print(VAL_PRINT_TEST, "\n FAST CH SIZE :%d", + return_values[CHAN_SIZE_OFFSET]); + val_print(VAL_PRINT_TEST, "\n DOORBELL ADDR LOW :%d", + return_values[DOORBELL_ADDR_LOW_OFFSET]); + val_print(VAL_PRINT_TEST, "\n DOORBELL ADDR HIGH :%d", + return_values[DOORBELL_ADDR_HIGH_OFFSET]); + val_print(VAL_PRINT_TEST, "\n DOORBELL MASK LOW :%d", + return_values[DOORBELL_MASK_LOW_OFFSET]); + val_print(VAL_PRINT_TEST, "\n DOORBELL MASK HIGH :%d", + return_values[DOORBELL_MASK_HIGH_OFFSET]); + val_print(VAL_PRINT_TEST, "\n DOORBELL PRESERVE LOW :%d", + return_values[DOORBELL_PRESERVE_LOW_OFFSET]); + val_print(VAL_PRINT_TEST, "\n DOORBELL PRESERVE HIGH :%d", + return_values[DOORBELL_PRESERVE_HIGH_OFFSET]); + } + } + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No domain support FAST CHANNEL "); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc025.c b/test_pool/powercap/test_pc025.c new file mode 100644 index 0000000000000000000000000000000000000000..3bb0ee06d658c00e2ca714409aad7d445ad81862 --- /dev/null +++ b/test_pool/powercap/test_pc025.c @@ -0,0 +1,76 @@ +/** @file + * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 25) +#define TEST_DESC "Powercap describe fast chl invalid domain check " + +#define PARAMETER_SIZE 2 + +uint32_t powercap_query_describe_fast_channel_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, message_id; + uint32_t parameters[PARAMETER_SIZE]; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if describe fast channel is not supported*/ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query powercap describe fast channel support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_DESCRIBE_FASTCHANNEL; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_DESCRIBE_FASTCHANNEL not supported "); + return VAL_STATUS_SKIP; + } + + /* Check Powercap describe fast channel for invalid domain */ + domain_id = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x00) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Query desc fastchannel for invalid domain id: %d", + domain_id); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = POWERCAP_CAP_GET; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DESCRIBE_FASTCHANNEL, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc026.c b/test_pool/powercap/test_pc026.c new file mode 100644 index 0000000000000000000000000000000000000000..8f43f8429fbeee0aea4ff36007fcd77c0b09aa6e --- /dev/null +++ b/test_pool/powercap/test_pc026.c @@ -0,0 +1,97 @@ +/** @file + * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 26) +#define TEST_DESC "Powercap describe fast chl invalid msg check " + +#define PARAMETER_SIZE 2 + +uint32_t powercap_query_describe_fast_channel_invalid_message(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, message_id; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if describe fast channel is not supported*/ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query powercap describe fast channel support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_DESCRIBE_FASTCHANNEL; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_DESCRIBE_FASTCHANNEL not supported "); + return VAL_STATUS_SKIP; + } + + /* Check powercap describe fast channel for valid domain */ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check if domain has fastchannel support. */ + if (val_get_domain_powercap_attribute(domain_id, PC_FASTCHANNEL_SUPPORT) + == PC_FASTCHANNEL_NOT_SUPP) + continue; + run_flag = 1; + + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Query fastchannel support for invalid msg id"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = POWERCAP_INVALID_COMMAND; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DESCRIBE_FASTCHANNEL, + COMMAND_MSG); + + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n No domain support FAST CHANNEL "); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/powercap/test_pc027.c b/test_pool/powercap/test_pc027.c new file mode 100644 index 0000000000000000000000000000000000000000..5661dbd643234457929cc940b52a7948647dd1a1 --- /dev/null +++ b/test_pool/powercap/test_pc027.c @@ -0,0 +1,104 @@ +/** @file + * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_powercap.h" + +#define TEST_NUM (SCMI_POWERCAP_TEST_NUM_BASE + 27) +#define TEST_DESC "Powercap desc fast chl unsupported domain check " + +#define PARAMETER_SIZE 2 + +uint32_t powercap_query_describe_fast_channel_unsupported_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, message_id; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if describe fast channel is not supported*/ + val_print(VAL_PRINT_TEST, "\n [Check 1] Query powercap describe fast channel support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = POWERCAP_DESCRIBE_FASTCHANNEL; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (status == SCMI_NOT_FOUND) { + val_print(VAL_PRINT_ERR, "\n POWERCAP_DESCRIBE_FASTCHANNEL not supported "); + return VAL_STATUS_SKIP; + } + + /* Check powercap describe fast channel for valid domain */ + num_domains = val_powercap_get_info(NUM_POWERCAP_DOMAINS, 0x00); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No powercap domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + if (val_get_domain_powercap_attribute(domain_id, PC_FASTCHANNEL_SUPPORT) == 0) + continue; + + for (message_id = POWERCAP_CAP_GET; message_id <= POWERCAP_PAI_SET; message_id++) + { + /* Check if domain has fastchannel support. */ + if (val_get_domain_powercap_attribute(domain_id, PC_FASTCHANNEL_SUPPORT) == + PC_FASTCHANNEL_SUPP) + continue; + run_flag = 1; + + val_print(VAL_PRINT_TEST, "\n POWERCAP DOMAIN ID:%d and msg_id: %d", + domain_id, message_id); + val_print(VAL_PRINT_TEST, + "\n [Check 2] Invoke describe fast chn for unsupported domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + parameters[param_count++] = message_id; + + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_POWERCAP, POWERCAP_DESCRIBE_FASTCHANNEL, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_SUPPORTED) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + } + } + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All domain support FAST CHANNEL "); + return VAL_STATUS_SKIP; + } + return VAL_STATUS_PASS; +} diff --git a/test_pool/reset/test_r005_v3_1.c b/test_pool/reset/test_r005_v3_1.c new file mode 100644 index 0000000000000000000000000000000000000000..138196b6420c208f35dbbbc527089bd0d4d78ac3 --- /dev/null +++ b/test_pool/reset/test_r005_v3_1.c @@ -0,0 +1,111 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_reset.h" + +#define TEST_NUM (SCMI_RESET_TEST_NUM_BASE + 5) +#define TEST_DESC "Reset domain attributes check " + +uint32_t reset_query_domain_attributes_scmi_v3_1(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, attribute; + uint32_t latency, async_support, notification_support; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found */ + num_domains = val_reset_get_info(NUM_RESET_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No reset domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Verify the reset IDs are starting from value 0 */ + domain_id = 0; + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_RESET, RESET_DOMAIN_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + val_print(VAL_PRINT_TEST, "\n [Check 2] Verify Domain IDs begin from 0"); + if (val_compare_status(status, SCMI_NOT_FOUND) == VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Check reset domain attributes for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n RESET DOMAIN ID: %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_RESET, RESET_DOMAIN_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attribute = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attribute, 0, 28)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + async_support = VAL_EXTRACT_BITS(attribute, 31, 31); + notification_support = VAL_EXTRACT_BITS(attribute, 30, 30); + extended_name_supp = VAL_EXTRACT_BITS(attribute, 29, 29); + + latency = return_values[LATANCY_OFFSET]; + + val_print(VAL_PRINT_DEBUG, "\n Async reset support : %d", + async_support); + val_print(VAL_PRINT_DEBUG, "\n Reset notifications support : %d", + notification_support); + val_print(VAL_PRINT_DEBUG, "\n Extended name support : %d", + extended_name_supp); + + val_print(VAL_PRINT_DEBUG, "\n Latency : %d", + latency); + + /* Save info for further tests*/ + val_reset_save_info(RESET_ASYNC_SUPPORT, domain_id, async_support); + val_reset_save_info(RESET_NOTIFY_SUPPORT, domain_id, notification_support); + val_reset_save_info(RESET_EXTENDED_NAME_SUPPORT, domain_id, extended_name_supp); + + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + (char *)val_reset_get_expected_name(domain_id), SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/reset/test_r012.c b/test_pool/reset/test_r012.c new file mode 100644 index 0000000000000000000000000000000000000000..9f13de550e7b9b0b797b572d1e8540a64442ecea --- /dev/null +++ b/test_pool/reset/test_r012.c @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_reset.h" + +#define TEST_NUM (SCMI_RESET_TEST_NUM_BASE + 17) +#define TEST_DESC "Reset domain ext name get check " + +uint32_t reset_query_ext_domain_name(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint8_t *extended_name; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_reset_get_info(NUM_RESET_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Reset domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Reset domain name for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n RESET DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query extended domain name"); + + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_reset_get_info(RESET_EXTENDED_NAME_SUPPORT, domain_id); + if (extended_name_supp != RESET_EXTENDED_DOMAIN_NAME) + { + val_print(VAL_PRINT_ERR, "\n Domain doesn't support extended name"); + continue; + } + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_RESET, RESET_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + extended_name = (uint8_t *) &return_values[RESET_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Reset domain name : %s", extended_name); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/reset/test_r013.c b/test_pool/reset/test_r013.c new file mode 100644 index 0000000000000000000000000000000000000000..e7d8907a75bca79c3867c65bb993cf727b5827b9 --- /dev/null +++ b/test_pool/reset/test_r013.c @@ -0,0 +1,99 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_reset.h" + +#define TEST_NUM (SCMI_RESET_TEST_NUM_BASE + 18) +#define TEST_DESC "Reset get ext name for invalid domain " + +uint32_t reset_query_ext_domain_name_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t extended_name_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get Extended name for invalid domain */ + domain_id = val_reset_get_info(NUM_RESET_DOMAINS, 0x0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_RESET, RESET_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no domains found */ + num_domains = val_reset_get_info(NUM_RESET_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Reset domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Reset domain name for unsupported domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_reset_get_info(RESET_EXTENDED_NAME_SUPPORT, domain_id); + + if (extended_name_supp == RESET_EXTENDED_DOMAIN_NAME) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n RESET DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_RESET, RESET_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/sensor/test_m005_v3.c b/test_pool/sensor/test_m005_v3.c index 67f5432904710319d2de53e3e8400a79a0fe59ea..09c83b76298c413a8e9bb4c3974d4da41ebd14e6 100644 --- a/test_pool/sensor/test_m005_v3.c +++ b/test_pool/sensor/test_m005_v3.c @@ -95,7 +95,8 @@ uint32_t sensor_query_description_get_scmi_v3(void) cont_update_notify_support = VAL_EXTRACT_BITS(sensor_desc[1], 30, 30); val_print(VAL_PRINT_DEBUG, "\n Cont Update Notify Sup : %d", cont_update_notify_support); - if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(sensor_desc[1], 15, 29)) != VAL_STATUS_PASS) + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(sensor_desc[1], 15, 29)) + != VAL_STATUS_PASS) return VAL_STATUS_FAIL; val_print(VAL_PRINT_DEBUG, "\n Timestamp exponent : %d", @@ -111,10 +112,12 @@ uint32_t sensor_query_description_get_scmi_v3(void) val_print(VAL_PRINT_DEBUG, "\n Number of trip points : %d", num_trip_points); /* sensor_attributes_high */ - if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(sensor_desc[2], 22, 31)) != VAL_STATUS_PASS) + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(sensor_desc[2], 22, 31)) + != VAL_STATUS_PASS) return VAL_STATUS_FAIL; - if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(sensor_desc[2], 9, 10)) != VAL_STATUS_PASS) + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(sensor_desc[2], 9, 10)) + != VAL_STATUS_PASS) return VAL_STATUS_FAIL; axis_support = VAL_EXTRACT_BITS(sensor_desc[2], 8, 8); @@ -178,7 +181,8 @@ uint32_t sensor_query_description_get_scmi_v3(void) val_sensor_ext_save_desc_info(SENSOR_AXIS_SUPPORT, sensor_id, axis_support); /* Ensure sensor description indicates sensor identifiers start from 0 and are sequential*/ - val_print(VAL_PRINT_TEST, "\n [Check 3] Ensure sensor IDs start from 0 and are sequential"); + val_print(VAL_PRINT_TEST, + "\n [Check 3] Ensure sensor IDs start from 0 and are sequential"); /* Get sensor ID for first returned sensor.*/ if (total_sensors == 0 && i == 0) { diff --git a/test_pool/sensor/test_m005_v3_1.c b/test_pool/sensor/test_m005_v3_1.c new file mode 100644 index 0000000000000000000000000000000000000000..abef58603cb461400cb46244de9ac9effca43766 --- /dev/null +++ b/test_pool/sensor/test_m005_v3_1.c @@ -0,0 +1,225 @@ +/** @file + * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_sensor.h" + +#define TEST_NUM (SCMI_SENSOR_TEST_NUM_BASE + 5) +#define TEST_DESC "Sensor description get check " + +#define SENSOR_DESC_LEN 13 +#define START_SENSOR_ID 0 +#define EXTENDED_ATTR_SUPPORTED 1 + +uint32_t sensor_query_description_get_scmi_v3_1(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_remaining_desc, num_desc_retured = 0; + uint32_t total_sensors = 0; + uint32_t i, desc_index = 0, sensor_id; + uint32_t async_support, num_trip_points, cont_update_notify_support; + uint32_t ext_sensor_name_supp; + uint32_t timestamp_support, ext_attr_support; + uint32_t *sensor_desc, num_sensor_flag; + uint32_t num_axis, unit_exponent, axis_support; + uint32_t sensor_type; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + val_print(VAL_PRINT_TEST, "\n [Check 1] Query sensor description "); + + /* Reading sensor description repeatedly until all sensor details received*/ + do + { + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + desc_index += num_desc_retured; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_SENSOR, SENSOR_DESCRIPTION_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &desc_index, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Check flag values */ + num_sensor_flag = return_values[NUM_SENSOR_FLAG_OFFSET]; + num_remaining_desc = VAL_EXTRACT_BITS(num_sensor_flag, 16, 31); + val_print(VAL_PRINT_DEBUG, "\n NUM OF REMAINING DESC : %d", num_remaining_desc); + + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(num_sensor_flag, 12, 15)) != + VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_desc_retured = VAL_EXTRACT_BITS(num_sensor_flag, 0, 11); + val_print(VAL_PRINT_DEBUG, "\n NUM OF DESC RETURNED : %d", num_desc_retured); + + /* Sensor desc start from return_values[1] */ + sensor_desc = &return_values[DESC_OFFSET]; + for (i = 0; i < num_desc_retured; i++) + { + val_print(VAL_PRINT_TEST, "\n Sensor description "); + + sensor_id = sensor_desc[i * SENSOR_DESC_LEN]; + val_print(VAL_PRINT_DEBUG, "\n Sensor id : %d", sensor_id); + + /* sensor_attributes_low */ + async_support = VAL_EXTRACT_BITS(sensor_desc[1 + (i * SENSOR_DESC_LEN)], 31, 31); + val_print(VAL_PRINT_DEBUG, "\n Async read support : %d", async_support); + + cont_update_notify_support = + VAL_EXTRACT_BITS(sensor_desc[1 + (i * SENSOR_DESC_LEN)], 30, 30); + val_print(VAL_PRINT_DEBUG, "\n Cont Update Notify Sup : %d", + cont_update_notify_support); + + ext_sensor_name_supp = VAL_EXTRACT_BITS(sensor_desc[1 + (i * SENSOR_DESC_LEN)], 29, 29); + val_print(VAL_PRINT_DEBUG, "\n Ext sensor name Sup : %d", + ext_sensor_name_supp); + + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS( + sensor_desc[1 + (i * SENSOR_DESC_LEN)], 15, 29)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_DEBUG, "\n Timestamp exponent : %d", + VAL_EXTRACT_BITS(sensor_desc[1 + (i * SENSOR_DESC_LEN)], 10, 14)); + + timestamp_support = VAL_EXTRACT_BITS(sensor_desc[1 + (i * SENSOR_DESC_LEN)], 9, 9); + val_print(VAL_PRINT_DEBUG, "\n Time stamp support : %d", timestamp_support); + + ext_attr_support = VAL_EXTRACT_BITS(sensor_desc[1 + (i * SENSOR_DESC_LEN)], 8, 8); + val_print(VAL_PRINT_DEBUG, "\n Extended Attr Support : %d", ext_attr_support); + + num_trip_points = VAL_EXTRACT_BITS(sensor_desc[1 + (i * SENSOR_DESC_LEN)], 0, 7); + val_print(VAL_PRINT_DEBUG, "\n Number of trip points : %d", num_trip_points); + + val_print(VAL_PRINT_TEST, "\n [Check 2] Check Extended attributes from Sensors"); + if (val_compare("Extended Attr Support ", ext_attr_support, EXTENDED_ATTR_SUPPORTED)) + return VAL_STATUS_FAIL; + + /* sensor_attributes_high */ + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS( + sensor_desc[2 + (i * SENSOR_DESC_LEN)], 22, 31)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + num_axis = VAL_EXTRACT_BITS(sensor_desc[2 + (i * SENSOR_DESC_LEN)], 16, 21); + val_print(VAL_PRINT_DEBUG, "\n Number of Axis : %d", num_axis); + + unit_exponent = VAL_EXTRACT_BITS(sensor_desc[2 + (i * SENSOR_DESC_LEN)], 11, 15); + val_print(VAL_PRINT_DEBUG, "\n Sensor Unit Exponent : %d", unit_exponent); + + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS( + sensor_desc[2 + (i * SENSOR_DESC_LEN)], 9, 10)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + axis_support = VAL_EXTRACT_BITS(sensor_desc[2 + (i * SENSOR_DESC_LEN)], 8, 8); + val_print(VAL_PRINT_DEBUG, "\n Sensor Axis Support : %d", axis_support); + + sensor_type = VAL_EXTRACT_BITS(sensor_desc[2 + (i * SENSOR_DESC_LEN)], 0, 7); + val_print(VAL_PRINT_DEBUG, "\n Sensor Type : %d", sensor_type); + + /* Sensor Name */ + val_print(VAL_PRINT_DEBUG, "\n Sensor name : %s", + &sensor_desc[3 + (i * SENSOR_DESC_LEN)]); + + /* Sensor Power */ + val_print(VAL_PRINT_DEBUG, "\n Sensor Power : %d", + sensor_desc[7 + (i * SENSOR_DESC_LEN)]); + + /* sensor resolution */ + val_print(VAL_PRINT_DEBUG, "\n Sensor Resolution exp : %d", + VAL_EXTRACT_BITS(sensor_desc[8 + (i * SENSOR_DESC_LEN)], 27, 31)); + + val_print(VAL_PRINT_DEBUG, "\n Sensor Resolution : %d", + VAL_EXTRACT_BITS(sensor_desc[8 + (i * SENSOR_DESC_LEN)], 0, 26)); + + /* Sensor Min Range */ + val_print(VAL_PRINT_DEBUG, "\n Sensor Min Range Low : %d", + sensor_desc[9 + (i * SENSOR_DESC_LEN)]); + val_print(VAL_PRINT_DEBUG, "\n Sensor Min Range High : %d", + sensor_desc[10 + (i * SENSOR_DESC_LEN)]); + + /* Sensor Max Range */ + val_print(VAL_PRINT_DEBUG, "\n Sensor Max Range Low : %d", + sensor_desc[11 + (i * SENSOR_DESC_LEN)]); + val_print(VAL_PRINT_DEBUG, "\n Sensor Max Range High : %d", + sensor_desc[12 + (i * SENSOR_DESC_LEN)]); + + /* Save sensor information */ + val_sensor_save_desc_info(SENSOR_NUM_OF_TRIP_POINTS, sensor_id, num_trip_points); + val_sensor_save_desc_info(SENSOR_ASYNC_READ_SUPPORT, sensor_id, async_support); + + /* Save extended sensor information */ + val_sensor_ext_save_desc_info(SENSOR_CONT_NOTIFY_UPDATE_SUPPORT, + sensor_id, cont_update_notify_support); + val_sensor_ext_save_desc_info(SENSOR_EXTENDED_NAME_SUPPORT, + sensor_id, ext_sensor_name_supp); + val_sensor_ext_save_desc_info(SENSOR_TIMESTAMP_SUPPORT, + sensor_id, timestamp_support); + val_sensor_ext_save_desc_info(SENSOR_NUM_OF_AXIS, sensor_id, num_axis); + val_sensor_ext_save_desc_info(SENSOR_AXIS_SUPPORT, sensor_id, axis_support); + + /* Ensure sensor description indicates sensor identifiers + * start from 0 and are sequential */ + val_print(VAL_PRINT_TEST, "\n [Check 3] Ensure sensor IDs start from 0"); + + /* Get sensor ID for first returned sensor.*/ + if (total_sensors == 0 && i == 0) + { + if (val_compare("START SENSOR ID ", sensor_id, START_SENSOR_ID)) + return VAL_STATUS_FAIL; + + val_print(VAL_PRINT_DEBUG, "\n Start Sensor : %s, has ID 0", + &sensor_desc[3 + (i * SENSOR_DESC_LEN)]); + } + /* Check sensor IDs are sequential. */ + if (val_compare("SENSOR ID SEQUENCE", sensor_id, i+total_sensors)) + return VAL_STATUS_FAIL; + } + total_sensors += num_desc_retured; + } while (num_remaining_desc > 0); + + if (val_compare("NUM OF DESC ", total_sensors, val_sensor_get_expected_num_sensors())) + return VAL_STATUS_FAIL; + + /* Sensor get desc for invalid descriptor index */ + desc_index = total_sensors + 1; + val_print(VAL_PRINT_TEST, "\n [Check 4] Query with invalid desc_index : %d", desc_index); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_SENSOR, SENSOR_DESCRIPTION_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &desc_index, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_INVALID_PARAMETERS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + return VAL_STATUS_PASS; +} diff --git a/test_pool/sensor/test_m018.c b/test_pool/sensor/test_m018.c index 61e94900f0fa1186ac9049e08ea6ef1032838c78..db9f14b07050cd3af2b857e1c690a8620fb2ed5b 100644 --- a/test_pool/sensor/test_m018.c +++ b/test_pool/sensor/test_m018.c @@ -98,7 +98,7 @@ uint32_t sensor_supported_update_intervals_check(void) intervals_array = &return_values[LEVEL_ARRAY_OFFSET]; /* Verify only 3 values are returned in case interva; return format is triplet */ - if (interval_format == LEVEL_FORMAT_TRIPLET) + if (interval_format == SENSOR_LEVEL_FORMAT_TRIPLET) { val_print(VAL_PRINT_TEST, "\n [Check 2] Verify triplet return format", sensor_id); @@ -161,7 +161,7 @@ uint32_t sensor_supported_update_intervals_check(void) } while (num_remaining_interval > 0); /* Check Sensor Update interval for invalid index values. */ - if (interval_format == LEVEL_FORMAT_TRIPLET) { + if (interval_format == SENSOR_LEVEL_FORMAT_TRIPLET) { continue; /* Ignore index for triplet return values */ } diff --git a/test_pool/sensor/test_m022.c b/test_pool/sensor/test_m022.c index daab56b79c5ccef5ec0b4fa0397917b655dca26c..7fd04850b8740047c0df965bb5e023a717e40a4f 100644 --- a/test_pool/sensor/test_m022.c +++ b/test_pool/sensor/test_m022.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -86,16 +86,16 @@ uint32_t sensor_set_configuration_check(void) default_sensor_state = VAL_EXTRACT_BITS(default_sensor_config, 0, 0); val_print(VAL_PRINT_DEBUG, "\n Default Sensor State : %d", default_sensor_state); - /* STEP 2: Set a sensor config with modified state. */ - val_print(VAL_PRINT_TEST, "\n [Step 2] Choose another state for sensor"); - new_sensor_state = (default_sensor_state == DISABLED) ? ENABLED : DISABLED; + /* Get sensor config with modified state. */ + new_sensor_state = (default_sensor_state == SENSOR_DISABLED) ? + SENSOR_ENABLED : SENSOR_DISABLED; new_sensor_config = val_sensor_set_config(update_interval, update_interval_exp, round_up_down, timestamp_reporting, new_sensor_state); - /* STEP 3 : Set new state for sensor */ - val_print(VAL_PRINT_TEST, "\n [Step 3] Set new sensor state"); + /* STEP 2 : Set new state for sensor */ + val_print(VAL_PRINT_TEST, "\n [Step 2] Set new sensor state"); val_print(VAL_PRINT_DEBUG, "\n New Sensor State : %d", new_sensor_state); VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); parameters[param_count++] = sensor_id; @@ -111,8 +111,8 @@ uint32_t sensor_set_configuration_check(void) if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) return VAL_STATUS_FAIL; - /* STEP 4 : Verify new state has been set */ - val_print(VAL_PRINT_TEST, "\n [Step 4] Verify newly set sensor state "); + /* STEP 3 : Verify new state has been set */ + val_print(VAL_PRINT_TEST, "\n [Step 3] Verify newly set sensor state "); VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); parameters[param_count++] = sensor_id; @@ -131,8 +131,8 @@ uint32_t sensor_set_configuration_check(void) if (val_compare("Updated sensor state ", sensor_state, new_sensor_state)) return VAL_STATUS_FAIL; - /* STEP 5 : Set default sensor state back */ - val_print(VAL_PRINT_TEST, "\n [Step 3] Set new sensor state"); + /* STEP 4 : Set default sensor state back */ + val_print(VAL_PRINT_TEST, "\n [Step 4] Restore default sensor state"); VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); parameters[param_count++] = sensor_id; parameters[param_count++] = default_sensor_config; diff --git a/test_pool/sensor/test_m024.c b/test_pool/sensor/test_m024.c index 1df2c192e660568e2b891bc611e6784ddbfded5e..ab5d8935c2f0e4560ec1bf700b85fe1217f8b7e5 100644 --- a/test_pool/sensor/test_m024.c +++ b/test_pool/sensor/test_m024.c @@ -54,7 +54,7 @@ uint32_t sensor_request_sensor_notification_check(void) /* Check sensor update notification is supported. */ notification_support = val_sensor_ext_get_desc_info(SENSOR_CONT_NOTIFY_UPDATE_SUPPORT, sensor_id); - if (val_compare("Sensor notification support enabled", notification_support, ENABLED) + if (val_compare("Sensor notification support enabled", notification_support, SENSOR_ENABLED) == VAL_STATUS_FAIL) { val_print(VAL_PRINT_TEST, "\n [Check 2] Notification for unsupported sensor"); @@ -63,7 +63,7 @@ uint32_t sensor_request_sensor_notification_check(void) COMMAND_MSG); parameters[param_count++] = sensor_id; - notify_enable = val_get_notify_enable_config(ENABLED); + notify_enable = val_get_notify_enable_config(SENSOR_ENABLED); parameters[param_count++] = notify_enable; val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, @@ -82,7 +82,7 @@ uint32_t sensor_request_sensor_notification_check(void) /* Check sensor state is enabled */ sensor_state = val_sensor_ext_get_desc_info(SENSOR_STATE, sensor_id); - if (val_compare("Sensor state enabled", sensor_state, ENABLED) + if (val_compare("Sensor state enabled", sensor_state, SENSOR_ENABLED) == VAL_STATUS_FAIL) continue; @@ -92,7 +92,7 @@ uint32_t sensor_request_sensor_notification_check(void) COMMAND_MSG); parameters[param_count++] = sensor_id; - notify_enable = val_get_notify_enable_config(ENABLED); + notify_enable = val_get_notify_enable_config(SENSOR_ENABLED); parameters[param_count++] = notify_enable; val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, diff --git a/test_pool/sensor/test_m025.c b/test_pool/sensor/test_m025.c index f2b798405d0811e098e5823cb212d18d60863ea9..0c4a070735c7da402c74e784bbd0707704fda6f7 100644 --- a/test_pool/sensor/test_m025.c +++ b/test_pool/sensor/test_m025.c @@ -47,7 +47,7 @@ uint32_t sensor_request_notification_invalid_id_check(void) COMMAND_MSG); parameters[param_count++] = sensor_id; - notify_enable = val_get_notify_enable_config(ENABLED); + notify_enable = val_get_notify_enable_config(SENSOR_ENABLED); parameters[param_count++] = notify_enable; val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, diff --git a/test_pool/sensor/test_m026.c b/test_pool/sensor/test_m026.c new file mode 100644 index 0000000000000000000000000000000000000000..e51376191476e61d6826b1cb1a0b29d274bc50d1 --- /dev/null +++ b/test_pool/sensor/test_m026.c @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_sensor.h" + +#define TEST_NUM (SCMI_SENSOR_TEST_NUM_BASE + 26) +#define TEST_DESC "Sensor name get check " + +uint32_t sensor_query_ext_domain_name(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t sensor_id, num_sensors; + uint8_t *extended_name; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no sensors found*/ + num_sensors = val_sensor_get_info(NUM_SENSORS); + if (num_sensors == 0) { + val_print(VAL_PRINT_ERR, "\n No Sensor found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM SENSORS : %d", num_sensors); + + /* Check sensor ID for valid name support */ + for (sensor_id = 0; sensor_id < num_sensors; sensor_id++) + { + val_print(VAL_PRINT_TEST, "\n SENSOR ID : %d", sensor_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query extended name"); + + /* Check if extended name is supported for this sensor */ + extended_name_supp = val_sensor_ext_get_desc_info(SENSOR_EXTENDED_NAME_SUPPORT, sensor_id); + if (extended_name_supp != SN_EXTENDED_DOMAIN_NAME) + { + val_print(VAL_PRINT_ERR, "\n Domain doesn't support extended name"); + continue; + } + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_SENSOR, SENSOR_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &sensor_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + extended_name = (uint8_t *) &return_values[SENSOR_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Sensor name : %s", extended_name); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/sensor/test_m027.c b/test_pool/sensor/test_m027.c new file mode 100644 index 0000000000000000000000000000000000000000..bc610bc7ee76835de040679575a8d740f3fd735a --- /dev/null +++ b/test_pool/sensor/test_m027.c @@ -0,0 +1,99 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_sensor.h" + +#define TEST_NUM (SCMI_SENSOR_TEST_NUM_BASE + 27) +#define TEST_DESC "Sensor get ext name for invalid ID " + +uint32_t sensor_query_domain_ext_name_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t sensor_id, num_sensors; + uint32_t extended_name_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get Extended name for invalid sensor */ + sensor_id = val_sensor_get_info(NUM_SENSORS) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_SENSOR, SENSOR_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &sensor_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no sensors found*/ + num_sensors = val_sensor_get_info(NUM_SENSORS); + if (num_sensors == 0) { + val_print(VAL_PRINT_ERR, "\n No Sensor found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM SENSORS : %d", num_sensors); + + /* Check ext sensor name for unsupported sensor */ + for (sensor_id = 0; sensor_id < num_sensors; sensor_id++) + { + /* Check if extended domain name is supported for this sensor */ + extended_name_supp = val_sensor_ext_get_desc_info(SENSOR_EXTENDED_NAME_SUPPORT, sensor_id); + + if (extended_name_supp == SN_EXTENDED_DOMAIN_NAME) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n SENSOR ID : %d", sensor_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_SENSOR, SENSOR_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &sensor_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/voltage/test_v003.c b/test_pool/voltage/test_v003.c index 0a449f82ad2bfd237d0d414d2cf28d6a2961ce01..cb616aa86d1272aea8be2508260c2a8780f67b98 100644 --- a/test_pool/voltage/test_v003.c +++ b/test_pool/voltage/test_v003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -75,6 +75,97 @@ uint32_t voltage_query_mandatory_command_support(void) val_print_return_values(return_value_count, return_values); + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Mandatory cmd VOLTAGE_CONFIG_SET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 3] VOLTAGE CONFIG SET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = VOLTAGE_CONFIG_SET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + + /* Mandatory cmd VOLTAGE_CONFIG_GET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 4] VOLTAGE CONFIG GET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = VOLTAGE_CONFIG_GET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + + /* Mandatory cmd VOLTAGE_LEVEL_SET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 5] VOLTAGE LEVEL SET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = VOLTAGE_LEVEL_SET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + + /* Mandatory cmd VOLTAGE_LEVEL_GET should be supported */ + val_print(VAL_PRINT_TEST, "\n [Check 6] VOLTAGE LEVEL GET support"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + message_id = VOLTAGE_LEVEL_GET; + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_PROTOCOL_MESSAGE_ATTRIBUTES, + COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &message_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + if (val_reserved_bits_check_is_zero(return_values[ATTRIBUTE_OFFSET]) != VAL_STATUS_PASS) return VAL_STATUS_FAIL; diff --git a/test_pool/voltage/test_v005_v2.c b/test_pool/voltage/test_v005_v2.c new file mode 100644 index 0000000000000000000000000000000000000000..a62feef15bb22acdd7821ee7f030dcfea02eb829 --- /dev/null +++ b/test_pool/voltage/test_v005_v2.c @@ -0,0 +1,94 @@ +/** @file + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_voltage.h" + +#define NAME_OFFSET 1 + +#define TEST_NUM (SCMI_VOLTAGE_TEST_NUM_BASE + 5) +#define TEST_DESC "Voltage domain attributes check " + +uint32_t voltage_query_domain_attributes_v2(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t domain_id, num_domains, attribute, ext_name_supp; + char *name; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_voltage_get_info(NUM_VOLTAGE_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Voltage domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check voltage domain attributes for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n VOLTAGE DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query attributes"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_DOMAIN_ATTRIBUTES, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + attribute = return_values[ATTRIBUTE_OFFSET]; + if (val_reserved_bits_check_is_zero(VAL_EXTRACT_BITS(attribute, 0, 29)) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + /* Extract voltage domain attributes */ + val_print(VAL_PRINT_DEBUG, "\n Async level set supp : %d", + val_get_voltage_attributes_flag(attribute, ASYNC_VOLTAGE_SET_SUPP)); + val_print(VAL_PRINT_DEBUG, "\n Extended name supp : %d", + val_get_voltage_attributes_flag(attribute, EXTENDED_NAME_SUPP)); + + ext_name_supp = val_get_voltage_attributes_flag(attribute, EXTENDED_NAME_SUPP); + name = (char *)val_voltage_get_expected_name(domain_id); + val_voltage_save_info(VOLTAGE_ATTRIBUTES, domain_id, attribute); + + if (ext_name_supp) { + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + name + strnlen(name, SCMI_NAME_STR_SIZE) - 16, SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } else { + if (val_compare_str("DOMAIN NAME", (char *)&return_values[NAME_OFFSET], + name, SCMI_NAME_STR_SIZE)) + return VAL_STATUS_FAIL; + } + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/voltage/test_v007.c b/test_pool/voltage/test_v007.c index 4498bfababac73f64ddcb3375e5b1f96b60cff53..e787a199b984c4ca53f1d00fe4d33adf129cd9ca 100644 --- a/test_pool/voltage/test_v007.c +++ b/test_pool/voltage/test_v007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -99,7 +99,7 @@ uint32_t voltage_query_describe_levels(void) voltage_array = &return_values[LEVEL_ARRAY_OFFSET]; /* Verify only 3 values are returned in case level return format is triplet */ - if (levels_return_format == LEVEL_FORMAT_TRIPLET) + if (levels_return_format == VOLTAGE_LEVEL_FORMAT_TRIPLET) { val_print(VAL_PRINT_TEST, "\n [Check 2] Verify triplet return format", domain_id); @@ -127,8 +127,8 @@ uint32_t voltage_query_describe_levels(void) val_print(VAL_PRINT_DEBUG, "\n Voltage Index : %d", voltage_index); voltage = voltage_array[i]; - voltage_index++; val_voltage_save_level(domain_id, voltage_index, voltage); + voltage_index++; val_print(VAL_PRINT_DEBUG, "\n Voltage : %d ", voltage); } @@ -138,7 +138,7 @@ uint32_t voltage_query_describe_levels(void) /* Check Voltage levels for invalid index values. */ - if (levels_return_format == LEVEL_FORMAT_TRIPLET) + if (levels_return_format == VOLTAGE_LEVEL_FORMAT_TRIPLET) continue; /* Ignore index for triplet return values */ /* Voltage describe level for invalid level index */ diff --git a/test_pool/voltage/test_v012_v2.c b/test_pool/voltage/test_v012_v2.c new file mode 100644 index 0000000000000000000000000000000000000000..1efc6e63ae38e0a84558e2353177806026903873 --- /dev/null +++ b/test_pool/voltage/test_v012_v2.c @@ -0,0 +1,171 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_voltage.h" + +#define TEST_NUM (SCMI_VOLTAGE_TEST_NUM_BASE + 12) +#define TEST_DESC "Voltage set new voltage level " + +#define RETURN_VALUE_COUNT 1 +#define PARAMETER_SIZE 3 + +/********* TEST ALGO ******************** + * Get the current voltage level + * Find a new level from previously saved voltage levels for domain + * Set new level in voltage domain + * Get the voltge level and compare with set voltage value + * Restore the default voltage level +*****************************************/ + +uint32_t voltage_set_voltage_level_v2(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t parameters[PARAMETER_SIZE]; + uint32_t num_domains, domain_id; + uint32_t level_index = 0; + uint32_t *voltage_array, start_voltage, default_voltage, voltage; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + num_domains = val_voltage_get_info(NUM_VOLTAGE_DOMAINS, 0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Voltage Domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n Voltage Domains: %d", num_domains); + + /* Check Voltage describe level for valid voltage domains */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* STEP 1 : Get currently operational voltage. */ + val_print(VAL_PRINT_TEST, "\n Voltage ID : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Step 1] Get Operational Voltage "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_LEVEL_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + default_voltage = return_values[ATTRIBUTE_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Voltage : 0x%08X", default_voltage); + + /* STEP 2 : Get first voltage level for domain. */ + val_print(VAL_PRINT_TEST, "\n [Step 2] Get allowed Voltage levels"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_DESCRIBE_LEVELS, COMMAND_MSG); + + parameters[param_count++] = domain_id; + parameters[param_count++] = level_index; + + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + voltage_array = &return_values[LEVEL_ARRAY_OFFSET]; + start_voltage = voltage_array[LEVEL_START_OFFSET]; + val_print(VAL_PRINT_DEBUG, "\n START VOLTAGE : 0x%08X", start_voltage); + + /* STEP 3 : Set new voltage level for domain. */ + val_print(VAL_PRINT_TEST, "\n [Step 3] Set allowed Voltage levels"); + val_print(VAL_PRINT_TEST, "\n [Check 1] Set new voltage level in domain"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_LEVEL_SET, COMMAND_MSG); + + parameters[param_count++] = domain_id; + parameters[param_count++] = VOLT_SET_SYNC; + parameters[param_count++] = start_voltage; + + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* STEP 4 : query newly set voltage level for domain */ + val_print(VAL_PRINT_TEST, "\n [Step 4] Get newly set Voltage "); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + parameters[param_count++] = domain_id; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_LEVEL_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + voltage = return_values[ATTRIBUTE_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Voltage : 0x%08X", voltage); + + /* Check this is voltage we set in step 3. */ + if (val_compare("Voltage Level", voltage, start_voltage)) + return VAL_STATUS_FAIL; + + /* STEP 5 : Set default voltage level for domain */ + val_print(VAL_PRINT_TEST, "\n [Step 5] Set default Voltage levels"); + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_LEVEL_SET, COMMAND_MSG); + + parameters[param_count++] = domain_id; + parameters[param_count++] = VOLT_SET_SYNC; + parameters[param_count++] = default_voltage; + + val_send_message(cmd_msg_hdr, param_count, parameters, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/voltage/test_v014.c b/test_pool/voltage/test_v014.c index 385a5e054a5b5f1517069acdf3bd5657696cf4f7..efdd8be69105ad0cb9d27c5ccf392a837fbe388d 100644 --- a/test_pool/voltage/test_v014.c +++ b/test_pool/voltage/test_v014.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -67,7 +67,7 @@ uint32_t voltage_set_invalid_voltage_level(void) /* Set invalid voltage level in command */ levels_return_format = val_voltage_get_info(VOLTAGE_LEVEL_FORMAT, domain_id); - if (levels_return_format == LEVEL_FORMAT_TRIPLET) + if (levels_return_format == VOLTAGE_LEVEL_FORMAT_TRIPLET) { voltage_start = val_voltage_get_info(VOLTAGE_LEVEL_START, domain_id); step_size = val_voltage_get_info(VOLTAGE_STEP_SIZE, domain_id); @@ -106,11 +106,11 @@ uint32_t voltage_set_invalid_voltage_level(void) /* Set domain ID */ parameters[param_count++] = domain_id; - /* Set flag values for voltage level */ + /* Set invalid flag values for voltage level */ flags = 1; parameters[param_count++] = flags; - val_print(VAL_PRINT_TEST, "\n Setting voltage values : 0x%08X", invalid_voltage); + val_print(VAL_PRINT_TEST, "\n Setting voltage values : 0x%08X", voltage_start); parameters[param_count++] = voltage_start; cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_LEVEL_SET, COMMAND_MSG); diff --git a/test_pool/voltage/test_v016.c b/test_pool/voltage/test_v016.c new file mode 100644 index 0000000000000000000000000000000000000000..a383b55083b483098dafe824d9b523eb91315ccd --- /dev/null +++ b/test_pool/voltage/test_v016.c @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_voltage.h" + +#define TEST_NUM (SCMI_VOLTAGE_TEST_NUM_BASE + 17) +#define TEST_DESC "Voltage domain ext name get check " + +uint32_t voltage_query_ext_domain_name(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint8_t *extended_name; + uint32_t extended_name_supp; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Skip if no domains found*/ + num_domains = val_voltage_get_info(NUM_VOLTAGE_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Voltage domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Voltage domain name for valid domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + val_print(VAL_PRINT_TEST, "\n VOLTAGE DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 1] Query extended domain name"); + + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_get_domain_voltage_attribute(domain_id, EXTENDED_NAME_SUPP); + if (extended_name_supp != VL_EXTENDED_DOMAIN_NAME) + { + val_print(VAL_PRINT_ERR, "\n Domain doesn't support extended name"); + continue; + } + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_SUCCESS) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + extended_name = (uint8_t *) &return_values[VOLTAGE_EXT_NAME_OFFSET]; + val_print(VAL_PRINT_TEST, "\n Voltage name : %s", extended_name); + } + + return VAL_STATUS_PASS; +} diff --git a/test_pool/voltage/test_v017.c b/test_pool/voltage/test_v017.c new file mode 100644 index 0000000000000000000000000000000000000000..f8ebf4471b3010db2100fcb459ceba2420ae5a79 --- /dev/null +++ b/test_pool/voltage/test_v017.c @@ -0,0 +1,99 @@ +/** @file + * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include "val_interface.h" +#include "val_voltage.h" + +#define TEST_NUM (SCMI_VOLTAGE_TEST_NUM_BASE + 18) +#define TEST_DESC "Voltage get ext name for invalid domain " + +uint32_t voltage_query_domain_ext_name_invalid_domain(void) +{ + int32_t status; + uint32_t rsp_msg_hdr; + uint32_t cmd_msg_hdr; + size_t param_count; + size_t return_value_count; + uint32_t return_values[MAX_RETURNS_SIZE]; + uint32_t num_domains, domain_id; + uint32_t extended_name_supp; + uint32_t run_flag = 0; + + if (val_test_initialize(TEST_NUM, TEST_DESC) != VAL_STATUS_PASS) + return VAL_STATUS_SKIP; + + /* Get Extended name for invalid domain */ + domain_id = val_voltage_get_info(NUM_VOLTAGE_DOMAINS, 0x0) + 1; + val_print(VAL_PRINT_TEST, "\n [Check 1] Get extended name for invalid domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + + /* Skip if no domains found*/ + num_domains = val_voltage_get_info(NUM_VOLTAGE_DOMAINS, 0x0); + if (num_domains == 0) { + val_print(VAL_PRINT_ERR, "\n No Voltage domains found "); + return VAL_STATUS_SKIP; + } + val_print(VAL_PRINT_DEBUG, "\n NUM DOMAINS : %d", num_domains); + + /* Check Voltage domain name for unsupported domain */ + for (domain_id = 0; domain_id < num_domains; domain_id++) + { + /* Check if extended domain name is supported for this domain */ + extended_name_supp = val_get_domain_voltage_attribute(domain_id, EXTENDED_NAME_SUPP); + + if (extended_name_supp == VL_EXTENDED_DOMAIN_NAME) + continue; + + run_flag = 1; + val_print(VAL_PRINT_TEST, "\n VOLTAGE DOMAIN : %d", domain_id); + val_print(VAL_PRINT_TEST, "\n [Check 2] Get extended name for unsupp. domain"); + + VAL_INIT_TEST_PARAM(param_count, rsp_msg_hdr, return_value_count, status); + param_count++; + cmd_msg_hdr = val_msg_hdr_create(PROTOCOL_VOLTAGE, VOLTAGE_DOMAIN_NAME_GET, COMMAND_MSG); + val_send_message(cmd_msg_hdr, param_count, &domain_id, &rsp_msg_hdr, &status, + &return_value_count, return_values); + + if (val_compare_status(status, SCMI_NOT_FOUND) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + if (val_compare_msg_hdr(cmd_msg_hdr, rsp_msg_hdr) != VAL_STATUS_PASS) + return VAL_STATUS_FAIL; + + val_print_return_values(return_value_count, return_values); + } + + if (run_flag == 0) { + val_print(VAL_PRINT_ERR, "\n All Domains support extended name"); + return VAL_STATUS_SKIP; + } + + return VAL_STATUS_PASS; +} diff --git a/val/include/pal_interface.h b/val/include/pal_interface.h index 5802f98a63519d662eec3f8ee6d16b13f6d27ab8..9aadc90f02699c91bdbe9d8fcc863985628d5849 100644 --- a/val/include/pal_interface.h +++ b/val/include/pal_interface.h @@ -68,6 +68,7 @@ void pal_receive_delayed_response(uint32_t *message_header_rcv, int32_t *status, void pal_receive_notification(uint32_t *message_header_rcv, size_t *return_values_count, uint32_t *return_values); uint32_t pal_agent_get_accessible_device(uint32_t agent_id); +uint32_t pal_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector); uint32_t pal_device_get_accessible_protocol(uint32_t device_id); uint32_t pal_agent_get_inaccessible_device(uint32_t agent_id); uint32_t pal_check_trusted_agent(uint32_t agent_id); @@ -124,4 +125,19 @@ uint32_t pal_voltage_get_expected_num_domains(void); uint8_t *pal_voltage_get_expected_name(uint32_t domain_id); #endif +#ifdef POWERCAP_PROTOCOL +uint32_t pal_powercap_get_expected_num_domains(void); +uint8_t *pal_powercap_get_expected_name(uint32_t domain_id); +#endif + +#ifdef PIN_CONTROL_PROTOCOL +uint32_t pal_pin_control_get_expected_num_pins(void); +uint32_t pal_pin_control_get_expected_num_groups(void); +uint32_t pal_pin_control_get_expected_num_functions(void); +uint32_t pal_pin_control_get_expected_pins_in_group(uint32_t identifier); +uint32_t pal_pin_control_get_expected_groups_in_func(uint32_t identifier); +uint32_t pal_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index); +uint32_t pal_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index); +#endif + #endif diff --git a/val/include/val_clock.h b/val/include/val_clock.h index b2efacaa81c9d5b9b4aee19c8f4500d3928cc8d6..b80c57bcd47c29d97933572ef5d1dc7932f8b02d 100644 --- a/val/include/val_clock.h +++ b/val/include/val_clock.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2020, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,10 +21,18 @@ #define VERSION_OFFSET 0 #define ATTRIBUTE_OFFSET 0 #define NAME_OFFSET 1 +#define ENABLE_DELAY_OFFSET 5 #define RATE_FLAG_OFFSET 0 #define RATES_OFFSET 1 #define RATE_LOWER_WORD_OFFSET 0 #define RATE_UPPER_WORD_OFFSET 1 +#define CLOCK_EXT_NAME_OFFSET 1 +#define CLOCK_CONFIG_OFFSET 1 +#define CLOCK_CONFIG_OEM_VAL_OFFSET 2 +#define CLOCK_PARENT_NAME_OFFSET 0 +#define CLOCK_PARENTS_FLAGS_OFFSET 0 +#define CLOCK_PARENT_START_OFFSET 0 +#define CLOCK_PARENTS_ARRAY_OFFSET 1 #define DELAYED_RESP_CLOCK_ID_OFFSET 0 #define DELAYED_RESP_RATE_LOWER_OFFSET 1 @@ -54,7 +62,9 @@ typedef struct { uint32_t num_clocks; uint32_t max_async_cmd; uint32_t clock_attribute[MAX_NUM_OF_CLOCKS]; + uint32_t num_possible_parents[MAX_NUM_OF_CLOCKS]; uint8_t clock_name[MAX_NUM_OF_CLOCKS][SCMI_NAME_STR_SIZE]; + uint32_t parent_id[MAX_NUM_OF_CLOCKS][MAX_NUM_OF_CLOCKS]; CLOCK_RATE_INFO_s clock_rate[MAX_NUM_OF_CLOCKS]; } CLOCK_INFO_s; @@ -77,10 +87,34 @@ uint32_t clock_config_set_invalid_attr_check(void); uint32_t clock_config_set_invalid_clock_id_check(void); uint32_t clock_config_set_check(void); +/* V2 Test cases */ +uint32_t clock_query_ext_domain_name(void); +uint32_t clock_query_domain_ext_name_invalid_domain(void); +uint32_t clock_attributes_check_v2(void); +uint32_t clock_rate_notification_query(void); +uint32_t clock_rate_notification_invalid_query(void); +uint32_t clock_rate_req_notification_query(void); +uint32_t clock_rate_req_notification_invalid_query(void); +uint32_t clock_parent_get_invalid_clock_id_check(void); + +/* V2.1 Test cases */ +uint32_t clock_query_mandatory_command_support_v2p1(void); +uint32_t clock_config_set_check_v2p1(void); +uint32_t clock_parent_name_support_get_check(void); +uint32_t clock_parent_name_support_set_check(void); +uint32_t clock_parent_set_invalid_check(void); +uint32_t clock_parent_set_invalid_clock_id_check(void); +uint32_t clock_attributes_check_v2p1(void); +uint32_t clock_config_get_check(void); +uint32_t clock_config_get_invalid_clock_id_check(void); +uint32_t clock_possible_parents_get_check(void); +uint32_t clock_possible_parents_get_invalid_id_check(void); + /* expected values */ uint32_t val_clock_get_expected_num_clocks(void); uint32_t val_clock_get_expected_max_async_cmd(void); uint32_t val_clock_get_expected_number_of_rates(uint32_t clock_id); uint32_t val_check_clock_config_change_support(uint32_t clock_id); - +uint32_t val_get_clock_attribute(uint32_t clock_id, uint32_t flag); +uint32_t val_get_clock_attributes_flag(uint32_t attribute, uint32_t flag); #endif diff --git a/val/include/val_interface.h b/val/include/val_interface.h index 39876ffdfe108862ee214d0684d22146f0fb1621..6acbbffadee0f36fa0128b2705b1a5a91339e39d 100644 --- a/val/include/val_interface.h +++ b/val/include/val_interface.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021-2023, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,6 +25,8 @@ #define PROTOCOL_VERSION_1 0x00010000 #define PROTOCOL_VERSION_2 0x00020000 #define PROTOCOL_VERSION_3 0x00030000 +#define PROTOCOL_VERSION_3_1 0x00031000 +#define PROTOCOL_VERSION_3_2 0x00032000 #define SCMI_BASE_TEST_NUM_BASE 100 #define SCMI_POWER_DOMAIN_TEST_NUM_BASE 200 @@ -34,20 +36,42 @@ #define SCMI_SENSOR_TEST_NUM_BASE 600 #define SCMI_RESET_TEST_NUM_BASE 700 #define SCMI_VOLTAGE_TEST_NUM_BASE 800 +#define SCMI_POWERCAP_TEST_NUM_BASE 900 +#define SCMI_PIN_CONTROL_TEST_NUM_BASE 1000 #define BASE_PROTOCOL_VERSION_1 0x00010000 #define BASE_PROTOCOL_VERSION_2 0x00020000 #define PERFORMANCE_PROTOCOL_VERSION_1 0x00010000 #define PERFORMANCE_PROTOCOL_VERSION_2 0x00020000 +#define PERFORMANCE_PROTOCOL_VERSION_3 0x00030000 +#define PERFORMANCE_PROTOCOL_VERSION_4 0x00040000 +#define RESET_PROTOCOL_VERSION_1 0x00010000 #define RESET_PROTOCOL_VERSION_2 0x00020000 +#define RESET_PROTOCOL_VERSION_3 0x00010000 #define POWER_PROTOCOL_VERSION_2 0x00020000 #define POWER_PROTOCOL_VERSION_2_1 0x00021000 +#define POWER_PROTOCOL_VERSION_3 0x00300000 #define SENSOR_PROTOCOL_VERSION_1 0x00010000 #define SENSOR_PROTOCOL_VERSION_2 0x00020000 +#define SENSOR_PROTOCOL_VERSION_3 0x00030000 + +#define SYSTEM_POWER_VERSION_1 0x00010000 +#define SYSTEM_POWER_VERSION_2 0x00020000 + +#define CLOCK_PROTOCOL_VERSION_1 0x00010000 +#define CLOCK_PROTOCOL_VERSION_2 0x00020000 +#define CLOCK_PROTOCOL_VERSION_2_1 0x00020001 + +#define VOLTAGE_PROTOCOL_VERSION_1 0x00010000 +#define VOLTAGE_PROTOCOL_VERSION_2 0x00020000 + +#define POWERCAP_PROTOCOL_VERSION_2 0x00020000 + +#define PIN_CONTROL_PROTOCOL_VERSION_1 0x00010000 /* set PRINT_LEVEL to one of the below values in your application entry to control the verbosity of the prints */ @@ -85,7 +109,8 @@ typedef enum { SCMI_GENERIC_ERROR = -8, SCMI_HARDWARE_ERROR = -9, SCMI_PROTOCOL_ERROR = -10, - SCMI_RESERVED = -11, + SCMI_IN_USE = -11, + SCMI_RESERVED = -12, SCMI_VENDOR_SPECIFIC = -128 } SCMI_STATUS; @@ -104,6 +129,8 @@ typedef enum { PROTOCOL_SENSOR, PROTOCOL_RESET, PROTOCOL_VOLTAGE, + PROTOCOL_POWERCAP, + PROTOCOL_PIN_CONTROL, PROTOCOL_MAX } PROTOCOL_IDENTIFIER; @@ -137,6 +164,7 @@ uint32_t val_compare_status(int32_t status, int32_t expected_status); uint32_t val_agent_get_accessible_device(uint32_t agent_id); uint32_t val_device_get_accessible_protocol(uint32_t device_id); uint32_t val_agent_get_inaccessible_device(uint32_t agent_id); +uint32_t val_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector); void val_agent_set_supported_protocol_list(uint32_t protocol_list); uint32_t val_agent_check_protocol_support(uint32_t protocol); uint32_t val_check_trusted_agent(uint32_t agent_id); @@ -186,6 +214,7 @@ void val_base_save_name(uint32_t param_identifier, uint8_t *vendor_name); uint32_t val_base_get_info(uint32_t param_identifier); uint32_t val_base_execute_tests(void); + /* POWER DOMAIN VAL APIs */ typedef enum { @@ -214,9 +243,15 @@ typedef enum { PD_STATE_CHANGE_NOTI_SUPPORT, PD_STATE_ASYNC_SUPPORT, PD_STATE_SYNC_SUPPORT, + PD_EXT_DOMAIN_NAME_SUPP, PD_DOMAIN_NAME } POWER_DOMAIN_INFO; +typedef enum{ + PD_NORMAL_DOMAIN_NAME, + PD_EXTENDED_DOMAIN_NAME +} PD_EXTENDED_NAME_SUPPORT; + uint32_t val_power_domain_get_info(uint32_t pd_id, uint32_t param_identifier); void val_power_domain_save_info(uint32_t param_identifier, uint32_t domain_id, uint32_t param_value); @@ -294,8 +329,15 @@ typedef enum { PERF_DOMAIN_MAX_LEVEL, PERF_DOMAIN_MIN_LEVEL, PERF_DOMAIN_INTERMEDIATE_LEVEL, + PERF_DOMAIN_EXT_NAME_SUPPORT, + PERF_DOMAIN_LVL_INDEX_MODE_SUPPORT } PERFORMANCE_DOMAIN_INFO; +typedef enum{ + PR_NORMAL_DOMAIN_NAME, + PR_EXTENDED_DOMAIN_NAME +} PR_EXTENDED_NAME_SUPPORT; + void val_performance_save_info(uint32_t param_identifier, uint32_t perf_id, uint32_t param_value); uint32_t val_performance_get_info(uint32_t param_identifier, uint32_t perf_id); uint32_t val_performance_execute_tests(void); @@ -314,6 +356,10 @@ typedef enum { CLOCK_NAME_GET, CLOCK_RATE_NOTIFY, CLOCK_RATE_CHANGE_REQUESTED_NOTIFY, + CLOCK_CONFIG_GET, + CLOCK_POSSIBLE_PARENTS_GET, + CLOCK_PARENT_SET, + CLOCK_PARENT_GET, CLOCK_INVALID_COMMAND } CLOCK_COMMANDS; @@ -330,10 +376,36 @@ typedef enum { CLOCK_HIGHEST_RATE } CLOCK_INFO; +typedef enum{ + CLOCK_NORMAL_DOMAIN_NAME, + CLOCK_EXTENDED_DOMAIN_NAME +} CLOCK_EXTENDED_NAME_SUPPORT_FLAG; + +typedef enum{ + CLOCK_PARENT_NOT_SUPP, + CLOCK_PARENT_SUPP +} CLOCK_PARENT_ENABLE; +typedef enum{ + CLOCK_NOTIFY_NOT_SUPP, + CLOCK_NOTIFY_SUPP +} CLOCK_NOTIFY_ENABLE; + +typedef enum { + CLOCK_RATE_CHNG_NOTI_SUPP = 0x0, + CLOCK_RATE_CHNG_REQ_NOTI_SUPP, + CLOCK_EXTENDED_NAME_SUPPORT, + CLOCK_PARENT_IDENTIFIER_SUPPORT, + CLOCK_ENABLE, +} CLOCK_ATTRIBUTES_FLAG; + + void val_clock_save_info(uint32_t param_identifier, uint32_t clock_id, uint32_t param_value); void val_clock_save_rate(uint32_t param_identifier, uint32_t clock_id, uint64_t param_value); void val_clock_save_name(uint32_t param_identifier, uint32_t clock_id, uint8_t *param_value); uint32_t val_clock_get_info(uint32_t param_identifier, uint32_t clock_id); +void val_clock_save_possible_parents(uint32_t domain_id, uint32_t level_index, uint32_t parent_id); +uint32_t val_clock_get_possible_parents(uint32_t domain_id, uint32_t level_index); +uint32_t val_clock_get_num_possible_parents(uint32_t domain_id); uint64_t val_clock_get_rate(uint32_t param_identifier, uint32_t clock_id); uint32_t val_clock_execute_tests(void); @@ -373,12 +445,28 @@ typedef enum { SENSOR_NUM_OF_TRIP_POINTS, SENSOR_ASYNC_READ_SUPPORT, SENSOR_CONT_NOTIFY_UPDATE_SUPPORT, + SENSOR_EXTENDED_NAME_SUPPORT, SENSOR_TIMESTAMP_SUPPORT, SENSOR_NUM_OF_AXIS, SENSOR_AXIS_SUPPORT, SENSOR_STATE, } SENSOR_INFO; +typedef enum{ + SN_NORMAL_DOMAIN_NAME, + SN_EXTENDED_DOMAIN_NAME +} SN_EXTENDED_NAME_SUPPORT; + +typedef enum{ + SENSOR_LEVEL_FORMAT_ARRAY, + SENSOR_LEVEL_FORMAT_TRIPLET, +} SENSOR_UPDATE_INTERVAL_FORMAT; + +typedef enum{ + SENSOR_DISABLED, + SENSOR_ENABLED, +} SENSOR_STATES; + void val_sensor_save_info(uint32_t param_identifier, uint32_t param_value); uint32_t val_sensor_get_info(uint32_t param_identifier); void val_sensor_save_desc_info(uint32_t param_identifier, uint32_t sensor_id, @@ -415,9 +503,15 @@ typedef enum { typedef enum { NUM_RESET_DOMAINS, RESET_ASYNC_SUPPORT, - RESET_NOTIFY_SUPPORT + RESET_NOTIFY_SUPPORT, + RESET_EXTENDED_NAME_SUPPORT } RESET_INFO; +typedef enum{ + RESET_NORMAL_DOMAIN_NAME, + RESET_EXTENDED_DOMAIN_NAME +} RESET_EXTENDED_NAME_FLAG; + void val_reset_save_info(uint32_t param_identifier, uint32_t domain_id, uint32_t param_value); uint32_t val_reset_get_info(uint32_t param_identifier, uint32_t domain_id); uint32_t val_reset_execute_tests(void); @@ -441,6 +535,7 @@ typedef enum { typedef enum { NUM_VOLTAGE_DOMAINS, VOLTAGE_DOMAIN_CONFIG, + VOLTAGE_ATTRIBUTES, VOLTAGE_LEVEL_FORMAT, VOLTAGE_LEVEL_START, VOLTAGE_LEVEL_END, @@ -448,6 +543,35 @@ typedef enum { OPERATIONAL_VOLTAGE } VOLTAGE_INFO; +typedef enum { + ASYNC_VOLTAGE_SET_SUPP = 0x0, + EXTENDED_NAME_SUPP +} VOLTAGE_ATTRIBUTES_FLAG; + +typedef enum { + VOLTAGE_LEVEL_SET_COMPLETE +} VOLTAGE_DELAYED_RESPONSE; + +typedef enum{ + VL_NORMAL_DOMAIN_NAME, + VL_EXTENDED_DOMAIN_NAME +} VL_EXTENDED_NAME_SUPPORT; + +typedef enum{ + VOLT_SET_SYNC, + VOLT_SET_ASYNC +} VOLTAGE_SET_MODE; + +typedef enum { + ARCHITECTURAL_MODE, + IMPLEMENTATION_DEFINED +} VOLTAGE_OPERATING_MODE_TYPE; + +typedef enum{ + VOLTAGE_LEVEL_FORMAT_ARRAY, + VOLTAGE_LEVEL_FORMAT_TRIPLET +} VOLTAGE_LEVEL_RETURN_FORMAT; + uint32_t val_voltage_execute_tests(void); void val_voltage_save_info(uint32_t param_identifier, uint32_t domain_id, uint32_t param_value); void val_voltage_save_level(uint32_t domain_id, uint32_t level_index, uint32_t voltage); @@ -455,4 +579,115 @@ uint32_t val_voltage_get_level(uint32_t domain_id, uint32_t level_index); uint32_t val_voltage_get_info(uint32_t param_identifier, uint32_t domain_id); uint32_t val_voltage_operating_mode_create(uint32_t mode_type, uint32_t mode_id); -#endif +/* POWERCAP VAL APIs */ + +typedef enum { + POWERCAP_PROTOCOL_VERSION = 0x0, + POWERCAP_PROTOCOL_ATTRIBUTES, + POWERCAP_PROTOCOL_MESSAGE_ATTRIBUTES, + POWERCAP_DOMAIN_ATTRIBUTES, + POWERCAP_CAP_GET, + POWERCAP_CAP_SET, + POWERCAP_PAI_GET, + POWERCAP_PAI_SET, + POWERCAP_DOMAIN_NAME_GET, + POWERCAP_MEASUREMENTS_GET, + POWERCAP_CAP_NOTIFY, + POWERCAP_MEASUREMENTS_NOTIFY, + POWERCAP_DESCRIBE_FASTCHANNEL, + POWERCAP_INVALID_COMMAND +} POWERCAP_COMMANDS; + +typedef enum { + POWERCAP_CAP_CHANGED, + POWERCAP_MEASUREMENTS_CHANGED +} POWERCAP_DELAYED_RESPONSE; + +typedef enum { + NUM_POWERCAP_DOMAINS, + POWERCAP_ATTRIBUTES, + POWERCAP_POWERCAP, + POWERCAP_PAI, + POWERCAP_MIN_POWER, + POWERCAP_MAX_POWER, + POWERCAP_MSG_FAST_CHNL_SUPP +} POWERCAP_INFO; + +typedef enum { + PC_CHANGE_NOTIFY_SUPP = 0x0, + PC_MEASUR_CHANG_NOTIFY_SUPP, + PC_ASYNC_PC_SET_SUPP, + PC_EXTENDED_NAME, + PC_CONFIG_SUPP, + PC_POWER_MONITOR_SUPP, + PC_PAI_CONFIG_SUPP, + PC_POWER_UNIT, + PC_FASTCHANNEL_SUPPORT, +} POWERCAP_ATTRIBUTES_FLAG; + +typedef enum{ + PC_NORMAL_DOMAIN_NAME, + PC_EXTENDED_DOMAIN_NAME +} PC_EXTENDED_NAME_SUPPORT; + +typedef enum{ + PC_NOTIFY_NOT_SUPP, + PC_NOTIFY_SUPP +} PC_NOTIFY_ENABLE; + +typedef enum{ + PC_FASTCHANNEL_NOT_SUPP, + PC_FASTCHANNEL_SUPP +} PC_FASTCHANNEL_SUPPORTED; + +typedef enum{ + PC_CAP_SET_SYNC, + PC_CAP_SET_ASYNC +} PC_CAP_SET_ASYNC_RESP_MODE; + +typedef enum{ + PC_CAP_SET_EXPECT, + PC_CAP_SET_IGNORE +} PC_CAP_SET_IGNORE_RESP_MODE; + + +uint32_t val_powercap_execute_tests(void); + +void val_powercap_save_info(uint32_t param_identifier, uint32_t domain_id, uint32_t param_value); +void val_powercap_save_level(uint32_t domain_id, uint32_t level_index, uint32_t powercap); +uint32_t val_powercap_get_level(uint32_t domain_id, uint32_t level_index); +uint32_t val_powercap_get_info(uint32_t param_identifier, uint32_t domain_id); + +/* PIN CONTROL Val API's*/ +typedef enum { + PIN_CONTROL_PROTOCOL_VERSION = 0x0, + PIN_CONTROL_PROTOCOL_ATTRIBUTES, + PIN_CONTROL_PROTOCOL_MESSAGE_ATTRIBUTES, + PIN_CONTROL_ATTRIBUTES, + PIN_CONTROL_LIST_ASSOCIATIONS, + PIN_CONTROL_CONFIG_GET, + PIN_CONTROL_CONFIG_SET, + PIN_CONTROL_FUNCTION_SELECT, + PIN_CONTROL_REQUEST, + PIN_CONTROL_RELEASE, + PIN_CONTROL_NAME_GET, + PIN_CONTROL_SET_PERMISSIONS, + PIN_CONTROL_INVALID_COMMAND +} PIN_CONTROL_COMMANDS; + +typedef enum { + PC_NUM_PINS, + PC_NUM_GROUPS, + PC_NUM_FUNCTIONS, + PC_NUM_PINS_IN_GROUP, + PC_NUM_GROUPS_IN_FUNCTION, + PC_PIN_NAME, + PC_GROUP_NAME, + PC_FUNCTION_NAME +} PIN_CONTROL_INFO; + +uint32_t val_pin_control_execute_tests(void); +void val_pin_control_save_info(uint32_t param_identifier, uint32_t pc_id, uint32_t param_value); +uint32_t val_pin_control_get_info(uint32_t pd_id, uint32_t param_identifier); + +#endif /* __VAL_INTERFACE_H__ */ diff --git a/val/include/val_performance.h b/val/include/val_performance.h index 2b4b43232193f9606d62f5e8e0ef5fca1f35bd58..b15d2f196b598b56e55bb02a3fb3f01b71aab26a 100644 --- a/val/include/val_performance.h +++ b/val/include/val_performance.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2020, 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -55,6 +55,7 @@ #define INVALID_NOTIFY_EN_VAL 0xFF #define NOTIFY_ENABLE 1 #define NOTIFY_DISABLE 0 +#define PERF_EXT_NAME_OFFSET 1 typedef struct { uint8_t performance_limits_set; @@ -73,6 +74,8 @@ typedef struct { uint32_t maximum_level; uint32_t minimum_level; uint32_t intermediate_level; + uint32_t domain_ext_name_supp; + uint32_t Perf_lvl_index_mode_support; } PERFORMANCE_DOMAIN_INFO_s; typedef struct { @@ -84,6 +87,7 @@ typedef struct { PERFORMANCE_DOMAIN_INFO_s perf_domain_info[MAX_PERFORMANCE_DOMAINS]; } PERFORMANCE_INFO_s; + /* Common Tests */ uint32_t performance_query_protocol_version(uint32_t *version); uint32_t performance_query_protocol_attributes(void); @@ -121,6 +125,18 @@ uint32_t performance_query_describe_fast_channel_unsupported_message(void); uint32_t performance_level_get_fast_channel(void); uint32_t performance_limits_get_fast_channel(void); +/* V3 Tests */ +uint32_t performance_query_domain_attributes_v3(void); +uint32_t performance_query_ext_domain_name(void); +uint32_t performance_query_domain_name_invalid_domain(void); +uint32_t performance_query_set_limit_v3(void); + +/* V4 Tests */ +uint32_t performance_query_domain_attributes_v4(void); +uint32_t performance_query_describe_levels_v4(void); +uint32_t performance_query_set_level_v4(void); +uint32_t performance_level_get_fast_channel_v4(void); + /* Get expected*/ uint32_t val_performance_get_expected_num_domains(void); uint32_t val_performance_get_expected_stats_addr_low(void); diff --git a/val/include/val_pin_control.h b/val/include/val_pin_control.h new file mode 100644 index 0000000000000000000000000000000000000000..4e0d87f1ab2038ab3d0bd274b96600ba45b95172 --- /dev/null +++ b/val/include/val_pin_control.h @@ -0,0 +1,103 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __VAL_PIN_CONTROL_H__ +#define __VAL_PIN_CONTROL_H__ + +#define MAX_PIN_IDENTIFIERS 5 +#define MAX_GROUP_IDENTIFIERS 10 +#define MAX_FUNCTIONS_IDENTIFIERS 10 +#define PIN_SELECTOR 0 +#define GROUP_SELECTOR 1 +#define FUNCTION_SELECTOR 2 +#define GET_ALL_CONFIGS 1 + +#define VERSION_OFFSET 0 +#define ATTRIBUTES_LOW_OFFSET 0 +#define ATTRIBUTES_HIGH_OFFSET 1 +#define ATTRIBUTE_OFFSET 0 +#define NAME_OFFSET 1 +#define RET_FLAGS_OFFSET 0 +#define PIN_CONTROL_IDS_ARRAY_OFFSET 1 +#define RET_NUM_CONFIGS_OFFSET 0 +#define RET_CONFIGS_ARRAY_OFFSET 1 +#define FUNCTION_SELECT_FLAGS_RESERVED_LOW 2 +#define REQUEST_FLAGS_RESERVED_LOW 2 +#define RELEASE_FLAGS_RESERVED_LOW 2 +#define PIN_CONTROL_EXT_NAME_OFFSET 1 + +#define GET_ALL_CONFIGS_LOW 18 +#define SELECTOR_LOW 16 +#define SET_CONFIGS_LOW 2 +#define PINCTRL_ACCESS_DENY 0 +#define PINCTRL_ACCESS_ALLOW 1 +#define PINCTRL_ACCESS_OFFSET 2 + +#define DEFAULT_CONFIG_TYPE 0 +#define PINCTRL_SET_INVALID_ATTIBUTE 3 +#define RESERVED_CONFIG_TYPE 21 +#define RESERVED_FLAGS_SET_PERM_LOW 3 + +typedef struct { + uint32_t num_pins; + uint32_t num_groups; + uint32_t num_functions; + uint16_t num_pins_in_group[MAX_GROUP_IDENTIFIERS]; + uint16_t num_groups_in_function[MAX_FUNCTIONS_IDENTIFIERS]; + uint8_t pc_pin_name[MAX_PIN_IDENTIFIERS][SCMI_NAME_STR_SIZE]; + uint8_t pc_group_name[MAX_GROUP_IDENTIFIERS][SCMI_NAME_STR_SIZE]; + uint8_t pc_function_name[MAX_FUNCTIONS_IDENTIFIERS][SCMI_NAME_STR_SIZE]; + uint32_t pin_ext_name_support[MAX_PIN_IDENTIFIERS]; + uint32_t group_ext_name_support[MAX_GROUP_IDENTIFIERS]; + uint32_t function_ext_name_support[MAX_FUNCTIONS_IDENTIFIERS]; +} PIN_CONTROL_INFO_s; + +/* Tests*/ +uint32_t pin_control_query_protocol_version(uint32_t *version); +uint32_t pin_control_query_protocol_attributes(void); +uint32_t pin_control_query_mandatory_command_support(void); +uint32_t pin_control_invalid_messageid_call(void); +uint32_t pin_control_attributes_check(void); +uint32_t pin_control_attributes_invalid_param_check(void); +uint32_t pin_control_query_list_associations(void); +uint32_t pin_control_query_list_associations_invalid_id_check(void); +uint32_t pin_control_query_config_get_check(void); +uint32_t pin_control_config_get_invalid_id_check(void); +uint32_t pin_control_query_config_set_check(void); +uint32_t pin_control_config_set_invalid_param_check(void); +uint32_t pin_control_config_set_invalid_id_check(void); +uint32_t pin_control_query_function_select_check(void); +uint32_t pin_control_query_function_select_invalid_case_check(void); +uint32_t pin_control_request_control_check(void); +uint32_t pin_control_query_request_invalid_case_check(void); +uint32_t pin_control_query_release_invalid_case_check(void); +uint32_t pin_control_query_ext_name_check(void); +uint32_t pin_control_query_ext_name_get_invalid_case_check(void); +uint32_t pin_control_set_permission_invalid_param_check(void); +uint32_t pin_control_set_permission_invalid_id_check(void); +uint32_t pin_control_set_permissions_check(void); + +uint32_t val_pin_control_get_expected_num_pins(void); +uint32_t val_pin_control_get_expected_num_groups(void); +uint32_t val_pin_control_get_expected_num_functions(void); +uint32_t val_pin_control_get_expected_pins_in_group(uint32_t identifier); +uint32_t val_pin_control_get_expected_groups_in_func(uint32_t identifier); +uint32_t val_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index); +uint32_t val_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index); +uint32_t val_pin_control_get_ext_name_info(uint32_t pc_id, uint32_t param_id); +void val_pin_control_save_ext_name_info(uint32_t param_id, uint32_t pc_id, uint32_t param_value); +#endif /* __VAL_PIN_CONTROL_H__ */ diff --git a/val/include/val_power_domain.h b/val/include/val_power_domain.h index 7557be957e914e16af7dbcfa89c53f8bfd8060a5..e7546eb0c83996e4121e2a0e5c7f7ce5de1f7498 100644 --- a/val/include/val_power_domain.h +++ b/val/include/val_power_domain.h @@ -27,6 +27,7 @@ #define STATS_LENGTH_OFFSET 3 #define DOMAIN_NAME_OFFSET 1 #define POWER_STATE_OFFSET 0 +#define PW_EXT_NAME_OFFSET 1 #define INVALID_SYNC_FLAG 0xF #define INVALID_ASYNC_FLAG 0xE @@ -44,6 +45,7 @@ typedef struct { uint32_t pd_noti_support[MAX_POWER_DOMAINS]; uint32_t pd_async_support[MAX_POWER_DOMAINS]; uint32_t pd_sync_support[MAX_POWER_DOMAINS]; + uint32_t pd_ext_dmn_name_supp[MAX_POWER_DOMAINS]; uint8_t pd_name[MAX_POWER_DOMAINS][SCMI_NAME_STR_SIZE]; } POWER_DOMAIN_INFO_s; @@ -70,6 +72,11 @@ uint32_t power_domain_power_state_change_requested_notify_invalid_domain_check(v /* scmi v3 Tests */ uint32_t power_domain_query_domain_attributes_scmi_v3(void); +/* scmi v3.1 Tests */ +uint32_t power_domain_query_domain_attributes_scmi_v3_1(void); +uint32_t power_query_ext_domain_name(void); +uint32_t power_query_ext_domain_name_invalid_domain(void); + uint32_t val_power_get_expected_num_domains(void); uint32_t val_power_get_expected_stats_addr_low(void); uint32_t val_power_get_expected_stats_addr_high(void); diff --git a/val/include/val_powercap.h b/val/include/val_powercap.h new file mode 100644 index 0000000000000000000000000000000000000000..7df8a40c86b1264e95ca03e24672bab9e3678e3a --- /dev/null +++ b/val/include/val_powercap.h @@ -0,0 +1,121 @@ +/** @file + * Copyright (c) 2021, 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __VAL_POWERCAP_H__ +#define __VAL_POWERCAP_H__ + +#define ATTRIBUTE_OFFSET 0 +#define NAME_OFFSET 1 +#define MIN_PAI_OFFSET 5 +#define MAX_PAI_OFFSET 6 +#define PAI_STEP_OFFSET 7 +#define MIN_POWER_CAP_OFFSET 8 +#define MAX_POWER_CAP_OFFSET 9 +#define POWER_CAP_STEP_OFFSET 10 +#define SUSTAINAIBLE_POWER_OFFSET 11 +#define ACCURACY_OFFSET 12 +#define PARENT_ID_OFFSET 13 + +#define MAX_NUM_OF_POWERCAP_DOMAINS 32 +#define MAX_NUMBER_POWERCAP_LEVELS 32 + +#define POWERCAP_OFFSET 0 +#define PAI_OFFSET 0 +#define PC_EXT_NAME_OFFSET 1 +#define MSR_POWER_OFFSET 0 +#define MSR_PAI_OFFSET 1 + +#define FAST_CH_RATE_LIMIT_OFFSET 1 +#define CHAN_ADDR_LOW_OFFSET 2 +#define CHAN_ADDR_HIGH_OFFSET 3 +#define CHAN_SIZE_OFFSET 4 +#define DOORBELL_ADDR_LOW_OFFSET 5 +#define DOORBELL_ADDR_HIGH_OFFSET 6 +#define DOORBELL_MASK_LOW_OFFSET 7 +#define DOORBELL_MASK_HIGH_OFFSET 8 +#define DOORBELL_PRESERVE_LOW_OFFSET 9 +#define DOORBELL_PRESERVE_HIGH_OFFSET 10 +#define DELAYED_RESP_DOMAIN_ID_OFFSET 0 +#define DELAYED_RESP_POWER_CAP_OFFSET 1 +#define DEL_RESP_CAP_CHNG_AGNT_ID_OFFSET 0 +#define DEL_RESP_CAP_CHNG_DMN_ID_OFFSET 1 +#define DEL_RESP_CAP_CHNG_PC_ID_OFFSET 2 +#define DEL_RESP_CAP_CHNG_PAI_ID_OFFSET 3 + +typedef struct { + uint32_t attributes; + uint32_t powercap; + uint32_t pai; + uint32_t min_power; + uint32_t max_power; +} POWERCAP_DOMAIN_INFO_s; + +typedef struct { + uint8_t powercap_cap_get; + uint8_t powercap_cap_set; + uint8_t powercap_pai_get; + uint8_t powercap_pai_set; +} POWERCAP_CMD_FAST_CH_SUPPORT_s; + +typedef struct { + uint32_t num_domains; + POWERCAP_CMD_FAST_CH_SUPPORT_s pc_cmd_fast_ch_supp; + POWERCAP_DOMAIN_INFO_s domain_info[MAX_NUM_OF_POWERCAP_DOMAINS]; +} POWERCAP_INFO_s; + + +/* Common Tests */ +uint32_t powercap_query_protocol_version(uint32_t *version); +uint32_t powercap_query_protocol_attributes(void); +uint32_t powercap_query_mandatory_command_support(void); +uint32_t powercap_invalid_messageid_call(void); +uint32_t powercap_query_domain_attributes(void); +uint32_t powercap_query_domain_attributes_invalid_id(void); +uint32_t powercap_query_get_powercap_value(void); +uint32_t powercap_query_invalid_domain_id(void); +uint32_t powercap_set_power_cap_value(void); +uint32_t powercap_invalid_domain_set_power_cap_value(void); +uint32_t powercap_query_get_pai_value(void); +uint32_t powercap_query_pai_invalid_domain_id(void); +uint32_t powercap_set_pai_value(void); +uint32_t powercap_invalid_domain_set_pai_value(void); +uint32_t powercap_query_domain_name(void); +uint32_t powercap_query_measurement(void); +uint32_t powercap_cap_notification_query(void); +uint32_t powercap_measurement_notification_query(void); +uint32_t powercap_query_describe_fast_channel(void); +uint32_t powercap_query_describe_fast_channel_invalid_domain(void); +uint32_t powercap_query_describe_fast_channel_invalid_message(void); +uint32_t powercap_query_describe_fast_channel_unsupported_domain(void); +uint32_t powercap_invalid_data_set_pai_value(void); +uint32_t powercap_query_domain_name_invalid_domain(void); +uint32_t powercap_cap_notification_invalid_query(void); +uint32_t powercap_measurement_notification_invalid_query(void); +uint32_t powercap_invalid_data_set_power_cap_value(void); + +/* Version 2 */ +uint32_t powercap_query_domain_attributes_v2(void); + +/* VAL Apis used in tests */ +uint32_t val_powercap_get_expected_num_domains(void); +uint8_t *val_powercap_get_expected_name(uint32_t domain_id); +uint32_t val_get_powercap_attributes_flag(uint32_t attribute, uint32_t flag); +void val_powercap_save_info(uint32_t param_identifier, uint32_t domain_id, uint32_t param_value); +uint32_t val_powercap_get_info(uint32_t param_identifier, uint32_t domain_id); +uint32_t val_get_domain_powercap_attribute(uint32_t domain_id, uint32_t flag); +uint32_t val_get_cap_set_flag(uint32_t async_resp_mode, uint32_t ignore_resp_mode); +#endif diff --git a/val/include/val_reset.h b/val/include/val_reset.h index 2f4d02ca18488d8feb930db28871fcab88557305..5bf564f0a1a1748ac9548bc6be301920e734251f 100644 --- a/val/include/val_reset.h +++ b/val/include/val_reset.h @@ -24,6 +24,7 @@ #define ATTRIBUTE_OFFSET 0 #define LATANCY_OFFSET 1 #define NAME_OFFSET 2 +#define RESET_EXT_NAME_OFFSET 1 #define ARCH_COLD_RESET 0 #define EXPLICIT_SYNC_DEASSERT_RESET 0 @@ -40,6 +41,7 @@ typedef struct { uint32_t async_support; uint32_t notify_support; + uint32_t extended_name_supp; } RESET_DOMAIN_INFO_s; typedef struct { @@ -63,6 +65,11 @@ uint32_t reset_query_invalid_notify_enable(void); /* scmi v3 Tests */ uint32_t reset_query_domain_attributes_scmi_v3(void); +/* SCMI v3.1 Test cases */ +uint32_t reset_query_domain_attributes_scmi_v3_1(void); +uint32_t reset_query_ext_domain_name(void); +uint32_t reset_query_ext_domain_name_invalid_domain(void); + uint32_t val_reset_get_expected_num_domains(void); uint8_t *val_reset_get_expected_name(uint32_t domain_id); diff --git a/val/include/val_sensor.h b/val/include/val_sensor.h index 8e18038e44331db124e47aa86dd7a0f2f9839ef1..d5ae6374f82139e996b415a64805cec1dc91bd68 100644 --- a/val/include/val_sensor.h +++ b/val/include/val_sensor.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -36,7 +36,7 @@ #define INTERVAL_END_OFFSET 1 #define INTERVAL_STEP_OFFSET 2 #define LEVEL_ARRAY_OFFSET 1 -#define SENSOR_CONFIG_OFFSET 1 +#define SENSOR_CONFIG_OFFSET 0 #define SENSOR_STATE_OFFSET 0 #define DELAYED_RESP_SENSOR_ID_OFFSET 0 @@ -56,16 +56,7 @@ #define TRIP_POINT_CROSSED_NEGETIVE_DIR 0x2 #define TRIP_POINT_CROSSED_EITHER_DIR 0x3 #define TRIP_POINT_ID_LOW 0x4 - -typedef enum{ - LEVEL_FORMAT_ARRAY, - LEVEL_FORMAT_TRIPLET, -} SENSOR_UPDATE_INTERVAL_FORMAT; - -typedef enum{ - DISABLED, - ENABLED, -} SENSOR_STATES; +#define SENSOR_EXT_NAME_OFFSET 1 typedef struct { uint32_t num_trip_points; @@ -74,6 +65,7 @@ typedef struct { typedef struct { uint32_t cont_update_notify_support; + uint32_t extended_name_support; uint32_t timestamp_support; uint32_t num_axis; uint32_t axis_support; @@ -89,6 +81,7 @@ typedef struct { SENSOR_EXTEND_INFO_s ext_desc_info[MAX_NUM_OF_SENSORS]; } SENSOR_INFO_s; + /* Common Tests */ uint32_t sensor_query_protocol_version(uint32_t *version); uint32_t sensor_query_protocol_attributes(void); @@ -116,8 +109,14 @@ uint32_t sensor_set_configuration_invalid_id_check(void); uint32_t sensor_request_sensor_notification_check(void); uint32_t sensor_request_notification_invalid_id_check(void); +/* V2 Test cases */ uint32_t sensor_query_description_get_scmi_v3(void); +/* V3 Test cases */ +uint32_t sensor_query_description_get_scmi_v3_1(void); +uint32_t sensor_query_ext_domain_name(void); +uint32_t sensor_query_domain_ext_name_invalid_domain(void); + uint32_t val_sensor_get_expected_num_sensors(void); uint32_t val_sensor_get_expected_stats_addr_low(void); uint32_t val_sensor_get_expected_stats_addr_high(void); diff --git a/val/include/val_voltage.h b/val/include/val_voltage.h index f9bba9b12cefeadfde13530eb71d5c7448e12517..dcf99e704c792ecb1af0d7d813361fbc653ea3e6 100644 --- a/val/include/val_voltage.h +++ b/val/include/val_voltage.h @@ -1,6 +1,6 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 + * Copyright (c) 2021, 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier :Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,22 +26,15 @@ #define LEVEL_STEP_OFFSET 2 #define START_LEVEL_INDEX 0 #define SECOND_LEVEL_INDEX 1 +#define DEL_RESP_VLT_ID_OFFSET 0 +#define VOLTAGE_EXT_NAME_OFFSET 1 #define MAX_NUM_OF_VOLTAGE_DOMAINS 32 #define MAX_NUMBER_VOLTAGE_LEVELS 32 -typedef enum { - ARCHITECTURAL_MODE, - IMPLEMENTATION_DEFINED -} VOLTAGE_OPERATING_MODE_TYPE; - -typedef enum{ - LEVEL_FORMAT_ARRAY, - LEVEL_FORMAT_TRIPLET -} VOLTAGE_LEVEL_RETURN_FORMAT; - typedef struct { uint32_t config; + uint32_t attributes; uint32_t voltage_level_format; uint32_t lowest_voltage_level; uint32_t highest_voltage_level; @@ -72,6 +65,14 @@ uint32_t voltage_set_voltage_invalid_domain(void); uint32_t voltage_set_invalid_voltage_level(void); uint32_t voltage_query_current_level(void); +/* V2 Tests */ +uint32_t voltage_query_domain_attributes_v2(void); +uint32_t voltage_query_domain_ext_name_invalid_domain(void); +uint32_t voltage_query_ext_domain_name(void); +uint32_t voltage_set_voltage_level_v2(void); + uint32_t val_voltage_get_expected_num_domains(void); uint8_t *val_voltage_get_expected_name(uint32_t domain_id); +uint32_t val_get_domain_voltage_attribute(uint32_t domain_id, uint32_t flag); +uint32_t val_get_voltage_attributes_flag(uint32_t attribute, uint32_t flag); #endif diff --git a/val/val_clock.c b/val/val_clock.c index 7f561aeef78ef03a59e39e365952e6f2fab27a0b..f16cfdd4c47f0664f8942b36ca8a1a3f9fee419f 100644 --- a/val/val_clock.c +++ b/val/val_clock.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,9 +37,21 @@ uint32_t val_clock_execute_tests(void) return VAL_STATUS_FAIL; RUN_TEST(clock_query_protocol_attributes()); - RUN_TEST(clock_query_mandatory_command_support()); + + if (version < CLOCK_PROTOCOL_VERSION_2_1) + RUN_TEST(clock_query_mandatory_command_support()); + else + RUN_TEST(clock_query_mandatory_command_support_v2p1()); + RUN_TEST(clock_invalid_messageid_call()); - RUN_TEST(clock_attributes_check()); + + if (version >= CLOCK_PROTOCOL_VERSION_2_1) + RUN_TEST(clock_attributes_check_v2p1()); + else if (version >= CLOCK_PROTOCOL_VERSION_2) + RUN_TEST(clock_attributes_check_v2()); + else + RUN_TEST(clock_attributes_check()); + RUN_TEST(clock_attributes_check_invalid_clock_id()); RUN_TEST(clock_query_describe_rates()); RUN_TEST(clock_query_describe_rates_invalid_clock_id()); @@ -51,7 +63,34 @@ uint32_t val_clock_execute_tests(void) RUN_TEST(clock_rate_get_invalid_clock_id_check()); RUN_TEST(clock_config_set_invalid_attr_check()); RUN_TEST(clock_config_set_invalid_clock_id_check()); - RUN_TEST(clock_config_set_check()); + + if (version >= CLOCK_PROTOCOL_VERSION_2_1) + RUN_TEST(clock_config_set_check_v2p1()); + else + RUN_TEST(clock_config_set_check()); + + if (val_protocol_version_relaxed(PROTOCOL_CLOCK, version, + CLOCK_PROTOCOL_VERSION_2)) { + RUN_TEST(clock_query_ext_domain_name()); + RUN_TEST(clock_query_domain_ext_name_invalid_domain()); + RUN_TEST(clock_rate_notification_query()); + RUN_TEST(clock_rate_notification_invalid_query()); + RUN_TEST(clock_rate_req_notification_query()); + RUN_TEST(clock_rate_req_notification_invalid_query()); + } + + if (version == CLOCK_PROTOCOL_VERSION_2_1) + { + RUN_TEST(clock_parent_get_invalid_clock_id_check()); + RUN_TEST(clock_config_get_check()); + RUN_TEST(clock_possible_parents_get_check()); + RUN_TEST(clock_possible_parents_get_invalid_id_check()); + RUN_TEST(clock_parent_name_support_get_check()); + RUN_TEST(clock_parent_name_support_set_check()); + RUN_TEST(clock_parent_set_invalid_check()); + RUN_TEST(clock_parent_set_invalid_clock_id_check()); + RUN_TEST(clock_config_get_invalid_clock_id_check()); + } } else val_print(VAL_PRINT_ERR, "\n Calling agent have no access to CLOCK protocol"); @@ -86,6 +125,22 @@ void val_clock_save_info(uint32_t param_identifier, uint32_t clock_id, uint32_t } } +/** + @brief This API is used to save the total number of possible parents of clock and its ID + 1. Caller - Test Suite. + 2. Prerequisite - Base protocol info table. + @param domain_id domain_id + @param level_index level_index + @param parent_id parent_id + @return none +**/ + +void val_clock_save_possible_parents(uint32_t domain_id, uint32_t level_index, uint32_t parent_id) +{ + g_clock_info_table.parent_id[domain_id][level_index] = parent_id; + g_clock_info_table.num_possible_parents[domain_id] += 1; +} + /** @brief This API is used to save clock rate info 1. Caller - Test Suite. @@ -112,6 +167,31 @@ void val_clock_save_rate(uint32_t param_identifier, uint32_t clock_id, uint64_t } } +/** + @brief This API is used to get clock possible parents + 1. Caller - Test Suite. + 2. Prerequisite - Base protocol info table. + @param domain_id domain_id + @param level_index level_index + @return parent_id +**/ + +uint32_t val_clock_get_possible_parents(uint32_t domain_id, uint32_t level_index) +{ + return g_clock_info_table.parent_id[domain_id][level_index]; +} + +/** + @brief This API is used to get the number of possible parents of clock + @param domain_id + @return num of possible parents +**/ + +uint32_t val_clock_get_num_possible_parents(uint32_t domain_id) +{ + return g_clock_info_table.num_possible_parents[domain_id]; +} + /** @brief This API is used to get clock protocol info 1. Caller - Test Suite. @@ -120,6 +200,7 @@ void val_clock_save_rate(uint32_t param_identifier, uint32_t clock_id, uint64_t @param clock_id clock id @return param_value value of the parameter **/ + uint32_t val_clock_get_info(uint32_t param_identifier, uint32_t clock_id) { uint32_t param_value = 0; @@ -171,6 +252,54 @@ uint64_t val_clock_get_rate(uint32_t param_identifier, uint32_t clock_id) return param_value; } +/** + @brief This API is used to get saved clock attribute. + @param clock_id clock ID + @return attribute value +**/ +uint32_t val_get_clock_attribute(uint32_t clock_id, uint32_t flag) +{ + uint32_t attribute; + + attribute = val_clock_get_info(CLOCK_ATTRIBUTE, clock_id); + return val_get_clock_attributes_flag(attribute, flag); +} + + +/** + @breif This API is used to get configuration flags from clock attributes + @param attribute attribute value for clock ID + @param flag clock attribute flag. + @return flag value +**/ +uint32_t val_get_clock_attributes_flag(uint32_t attribute, uint32_t flag) +{ + uint32_t flag_value = 0; + + switch (flag) + { + case CLOCK_RATE_CHNG_NOTI_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 31, 31); + break; + case CLOCK_RATE_CHNG_REQ_NOTI_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 30, 30); + break; + case CLOCK_EXTENDED_NAME_SUPPORT: + flag_value = VAL_EXTRACT_BITS(attribute, 29, 29); + break; + case CLOCK_PARENT_IDENTIFIER_SUPPORT: + flag_value = VAL_EXTRACT_BITS(attribute, 28, 28); + break; + case CLOCK_ENABLE: + flag_value = VAL_EXTRACT_BITS(attribute, 0, 0); + break; + default: + val_print(VAL_PRINT_ERR, "\nUnidentified parameter %d", flag); + } + + return flag_value; +} + /** @brief This API is used to set clock vendor name 1. Caller - Test Suite. diff --git a/val/val_interface.c b/val/val_interface.c index cdd56df4a109375f3ac72e823f5709a3d0ef6690..cda2dc21175cf1ce8d6f6c183032cdeade34338c 100644 --- a/val/val_interface.c +++ b/val/val_interface.c @@ -69,7 +69,7 @@ uint32_t val_initialize_system(void *info) **/ uint32_t val_test_initialize(uint32_t test_num, char *test_desc) { - val_print(VAL_PRINT_ERR, "\n%3d: %s ", test_num, test_desc); + val_print(VAL_PRINT_ERR, "\n%4d: %s ", test_num, test_desc); return VAL_STATUS_PASS; } @@ -348,6 +348,8 @@ char *val_get_status_string(int32_t status) return "SCMI_HARDWARE_ERR"; case SCMI_PROTOCOL_ERROR: return "SCMI_PROTOCOL_ERR"; + case SCMI_IN_USE: + return "SCMI_IN_USE_ERR"; case SCMI_RESERVED: return "SCMI_RESERVED_ERR"; default: diff --git a/val/val_performance.c b/val/val_performance.c index 28b6fd348e194a682b000fdc171eab9dd215ba36..4fab1d8332feb049d08b2909c5a38a37f72c00fc 100644 --- a/val/val_performance.c +++ b/val/val_performance.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -38,19 +38,28 @@ uint32_t val_performance_execute_tests(void) RUN_TEST(performance_query_protocol_attributes()); + if (version == PERFORMANCE_PROTOCOL_VERSION_4) + RUN_TEST(performance_query_domain_attributes_v4()); + if (val_protocol_version_strict(version, PERFORMANCE_PROTOCOL_VERSION_1)) { RUN_TEST(performance_query_mandatory_command_support_v1()); RUN_TEST(performance_invalid_messageid_call()); RUN_TEST(performance_query_domain_attributes_v1()); } - if (val_protocol_version_relaxed(PROTOCOL_PERFORMANCE, version, PERFORMANCE_PROTOCOL_VERSION_2)) { + if (val_protocol_version_relaxed(PROTOCOL_PERFORMANCE, version, + PERFORMANCE_PROTOCOL_VERSION_2)) { RUN_TEST(performance_query_mandatory_command_support()); RUN_TEST(performance_invalid_messageid_call()); RUN_TEST(performance_query_domain_attributes()); } RUN_TEST(performance_query_domain_attributes_invalid_domain()); - RUN_TEST(performance_query_describe_levels()); + + if (version < PERFORMANCE_PROTOCOL_VERSION_4) + RUN_TEST(performance_query_describe_levels()); + else + RUN_TEST(performance_query_describe_levels_v4()); + RUN_TEST(performance_query_describe_levels_invalid_domain()); RUN_TEST(performance_query_set_limit()); RUN_TEST(performance_query_set_limit_invalid_range()); @@ -65,7 +74,8 @@ uint32_t val_performance_execute_tests(void) RUN_TEST(performance_query_notify_level_invalid_parameters()); RUN_TEST(performance_query_notify_level_invalid_domain()); - if (val_protocol_version_relaxed(PROTOCOL_PERFORMANCE, version, PERFORMANCE_PROTOCOL_VERSION_2)) { + if (val_protocol_version_relaxed(PROTOCOL_PERFORMANCE, version, + PERFORMANCE_PROTOCOL_VERSION_2)) { RUN_TEST(performance_query_describe_fast_channel()); RUN_TEST(performance_query_describe_fast_channel_invalid_domain()); RUN_TEST(performance_query_describe_fast_channel_invalid_message()); @@ -75,10 +85,24 @@ uint32_t val_performance_execute_tests(void) RUN_TEST(performance_limit_set_async()); RUN_TEST(performance_level_set_async()); - if (val_protocol_version_relaxed(PROTOCOL_PERFORMANCE, version, PERFORMANCE_PROTOCOL_VERSION_2)) { + if (val_protocol_version_relaxed(PROTOCOL_PERFORMANCE, version, + PERFORMANCE_PROTOCOL_VERSION_2)) { RUN_TEST(performance_level_get_fast_channel()); RUN_TEST(performance_limits_get_fast_channel()); } + if (val_protocol_version_relaxed(PROTOCOL_PERFORMANCE, version, + PERFORMANCE_PROTOCOL_VERSION_3)) { + RUN_TEST(performance_query_domain_attributes_v3()); + RUN_TEST(performance_query_ext_domain_name()); + RUN_TEST(performance_query_domain_name_invalid_domain()); + RUN_TEST(performance_query_set_limit_v3()); + } + + if (version == PERFORMANCE_PROTOCOL_VERSION_4) { + RUN_TEST(performance_query_domain_attributes_v4()); + RUN_TEST(performance_query_set_level_v4()); + RUN_TEST(performance_level_get_fast_channel_v4()); + } } else val_print(VAL_PRINT_ERR, "\n Calling agent have no access to PERFORMANCE protocol"); @@ -140,15 +164,21 @@ void val_performance_save_info(uint32_t param_identifier, uint32_t perf_id, uint case PERF_DOMAIN_INTERMEDIATE_LEVEL: g_performance_info_table.perf_domain_info[perf_id].intermediate_level = param_value; break; + case PERF_DOMAIN_EXT_NAME_SUPPORT: + g_performance_info_table.perf_domain_info[perf_id].domain_ext_name_supp = param_value; + break; + case PERF_DOMAIN_LVL_INDEX_MODE_SUPPORT: + g_performance_info_table.perf_domain_info[perf_id].Perf_lvl_index_mode_support = param_value; + break; case PERF_MESSAGE_FAST_CH_SUPPORT: switch (perf_id) { case PERFORMANCE_LIMITS_SET: - g_performance_info_table.perf_fast_cmd_ch_support.performance_level_set = + g_performance_info_table.perf_fast_cmd_ch_support.performance_limits_set = param_value; break; case PERFORMANCE_LIMITS_GET: - g_performance_info_table.perf_fast_cmd_ch_support.performance_level_get = + g_performance_info_table.perf_fast_cmd_ch_support.performance_limits_get = param_value; break; case PERFORMANCE_LEVEL_SET: @@ -222,6 +252,12 @@ uint32_t val_performance_get_info(uint32_t param_identifier, uint32_t perf_id) case PERF_DOMAIN_INTERMEDIATE_LEVEL: param_value = g_performance_info_table.perf_domain_info[perf_id].intermediate_level; break; + case PERF_DOMAIN_EXT_NAME_SUPPORT: + param_value = g_performance_info_table.perf_domain_info[perf_id].domain_ext_name_supp; + break; + case PERF_DOMAIN_LVL_INDEX_MODE_SUPPORT: + param_value = g_performance_info_table.perf_domain_info[perf_id].Perf_lvl_index_mode_support; + break; case PERF_MESSAGE_FAST_CH_SUPPORT: switch (perf_id) { diff --git a/val/val_pin_control.c b/val/val_pin_control.c new file mode 100644 index 0000000000000000000000000000000000000000..1a074c4cdc372b473f71febdb47aa39e1a239617 --- /dev/null +++ b/val/val_pin_control.c @@ -0,0 +1,304 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ +#ifdef PIN_CONTROL_PROTOCOL + +#include "val_interface.h" +#include "val_pin_control.h" + +static PIN_CONTROL_INFO_s g_pin_control_info_table; + +/** + @brief This API is called from app layer to execute power domain tests + @param none + @return test execution result +**/ +uint32_t val_pin_control_execute_tests(void) +{ + uint32_t version = 0; + + val_memset((void *)&g_pin_control_info_table, 0, sizeof(g_pin_control_info_table)); + + if (val_agent_check_protocol_support(PROTOCOL_PIN_CONTROL)) { + if (RUN_TEST(pin_control_query_protocol_version(&version))) + return VAL_STATUS_FAIL; + + /* TODO add tests here */ + RUN_TEST(pin_control_query_protocol_attributes()); + RUN_TEST(pin_control_query_mandatory_command_support()); + RUN_TEST(pin_control_invalid_messageid_call()); + RUN_TEST(pin_control_attributes_check()); + RUN_TEST(pin_control_attributes_invalid_param_check()); + RUN_TEST(pin_control_query_list_associations()); + RUN_TEST(pin_control_query_list_associations_invalid_id_check()); + RUN_TEST(pin_control_query_config_get_check()); + RUN_TEST(pin_control_config_get_invalid_id_check()); + RUN_TEST(pin_control_query_config_set_check()); + RUN_TEST(pin_control_config_set_invalid_param_check()); + RUN_TEST(pin_control_config_set_invalid_id_check()); + RUN_TEST(pin_control_query_function_select_check()); + RUN_TEST(pin_control_query_function_select_invalid_case_check()); + RUN_TEST(pin_control_request_control_check()); + RUN_TEST(pin_control_query_request_invalid_case_check()); + RUN_TEST(pin_control_query_release_invalid_case_check()); + RUN_TEST(pin_control_query_ext_name_check()); + RUN_TEST(pin_control_query_ext_name_get_invalid_case_check()); + RUN_TEST(pin_control_set_permissions_check()); + RUN_TEST(pin_control_set_permission_invalid_param_check()); + RUN_TEST(pin_control_set_permission_invalid_id_check()); + } + else + val_print(VAL_PRINT_ERR, "\n Calling agent have no access to PIN CONTROL protocol"); + + return VAL_STATUS_PASS; +} + +/** + @brief This API is used to set pin_control protocol info + 1. Caller - Test Suite. + 2. Prerequisite - Pin control protocol info table. + @param param_identifier id of parameter which will be set + @param pc_id pin control identifier + @param param_value value of parameter + @return none +**/ +void val_pin_control_save_info(uint32_t param_identifier, uint32_t pc_id, uint32_t param_value) +{ + switch (param_identifier) + { + case PC_NUM_PINS: + g_pin_control_info_table.num_pins = param_value; + break; + case PC_NUM_GROUPS: + g_pin_control_info_table.num_groups = param_value; + break; + case PC_NUM_FUNCTIONS: + g_pin_control_info_table.num_functions = param_value; + break; + case PC_NUM_PINS_IN_GROUP: + g_pin_control_info_table.num_pins_in_group[pc_id] = param_value; + break; + case PC_NUM_GROUPS_IN_FUNCTION: + g_pin_control_info_table.num_groups_in_function[pc_id] = param_value; + break; + default: + val_print(VAL_PRINT_WARN, "\nUnidentified parameter %d", param_identifier); + } +} + +/** + @brief This API is used to get pin_control protocol info + 1. Caller - Test Suite. + 2. Prerequisite - Pin Control protocol info table. + @param pc_id pin control identifier + @param param_identifier id of parameter which will be set + @return param_value value of the parameter +**/ +uint32_t val_pin_control_get_info(uint32_t pc_id, uint32_t param_identifier) +{ + uint32_t param_value = 0; + + switch (param_identifier) + { + case PC_NUM_PINS: + param_value = g_pin_control_info_table.num_pins; + break; + case PC_NUM_GROUPS: + param_value = g_pin_control_info_table.num_groups; + break; + case PC_NUM_FUNCTIONS: + param_value = g_pin_control_info_table.num_functions; + break; + case PC_NUM_PINS_IN_GROUP: + param_value = g_pin_control_info_table.num_pins_in_group[pc_id]; + break; + case PC_NUM_GROUPS_IN_FUNCTION: + param_value = g_pin_control_info_table.num_groups_in_function[pc_id]; + break; + default: + val_print(VAL_PRINT_WARN, "\nUnidentified parameter %d", param_identifier); + } + + return param_value; +} + +/** + @brief This API is used to save pin control ext name support info + 1. Caller - Test Suite. + 2. Prerequisite - Pin control protocol info table. + @param param_id id of parameter which we save + @param pc_id pin control identifier + @param param_value value of parameter + @return none +**/ +void val_pin_control_save_ext_name_info(uint32_t param_id, uint32_t pc_id, uint32_t param_value) +{ + switch (param_id) + { + case PC_PIN_NAME: + g_pin_control_info_table.pin_ext_name_support[pc_id] = param_value; + break; + case PC_GROUP_NAME: + g_pin_control_info_table.group_ext_name_support[pc_id] = param_value; + break; + case PC_FUNCTION_NAME: + g_pin_control_info_table.function_ext_name_support[pc_id] = param_value; + break; + default: + val_print(VAL_PRINT_WARN, "\nUnidentified parameter %d", param_id); + } +} + +/** + @brief This API is used to get pin_control ext name support info + 1. Caller - Test Suite. + 2. Prerequisite - Pin Control protocol info table. + @param pc_id pin control identifier + @param param_id id of parameter which will be get + @return param_value value of the parameter +**/ +uint32_t val_pin_control_get_ext_name_info(uint32_t pc_id, uint32_t param_id) +{ + uint32_t param_value = 0; + + switch (param_id) + { + case PC_PIN_NAME: + param_value = g_pin_control_info_table.pin_ext_name_support[pc_id]; + break; + case PC_GROUP_NAME: + param_value = g_pin_control_info_table.group_ext_name_support[pc_id]; + break; + case PC_FUNCTION_NAME: + param_value = g_pin_control_info_table.function_ext_name_support[pc_id]; + break; + default: + val_print(VAL_PRINT_WARN, "\nUnidentified parameter %d", param_id); + } + + return param_value; +} + +/** + @brief This API is used to set pin control name + 1. Caller - Test Suite. + 2. Prerequisite - Base protocol info table. + @param param_identifier id of parameter which will be set + @param pc_id pin control identifier + @param param_value value of parameter + @return none +**/ +void val_pin_control_save_name(uint32_t param_identifier, uint32_t pc_id, uint8_t *param_value) +{ + switch (param_identifier) + { + case PC_PIN_NAME: + val_strcpy(&g_pin_control_info_table.pc_pin_name[pc_id][0], param_value); + break; + case PC_GROUP_NAME: + val_strcpy(&g_pin_control_info_table.pc_group_name[pc_id][0], param_value); + break; + case PC_FUNCTION_NAME: + val_strcpy(&g_pin_control_info_table.pc_function_name[pc_id][0], param_value); + break; + default: + val_print(VAL_PRINT_WARN, "\nUnidentified parameter %d", param_identifier); + } +} + +/** + @brief This API is used for checking num of pins + @param none + @return num of pins +**/ +uint32_t val_pin_control_get_expected_num_pins(void) +{ + return pal_pin_control_get_expected_num_pins(); +} + +/** + @brief This API is used for checking num of groups + @param none + @return num of groups +**/ +uint32_t val_pin_control_get_expected_num_groups(void) +{ + return pal_pin_control_get_expected_num_groups(); +} + +/** + @brief This API is used for checking num of functions + @param none + @return num of functions +**/ +uint32_t val_pin_control_get_expected_num_functions(void) +{ + return pal_pin_control_get_expected_num_functions(); +} + +/** + @brief This API is used for checking num of pins in a group + @param identifier of the pin + @return num of pins in a group +**/ +uint32_t val_pin_control_get_expected_pins_in_group(uint32_t identifier) +{ + return pal_pin_control_get_expected_pins_in_group(identifier); +} + +/** + @brief This API is used for checking num of groups associated with the function + @param identifier of the function + @return num of groups in function +**/ +uint32_t val_pin_control_get_expected_groups_in_func(uint32_t identifier) +{ + return pal_pin_control_get_expected_groups_in_func(identifier); +} + +/** + @brief This API is used to get identifier of pin associated with the group + @param identifier of the group + @return pin identifier of group in index +**/ +uint32_t val_pin_control_get_expected_group_associations(uint32_t identifier, uint32_t index) +{ + return pal_pin_control_get_expected_group_associations(identifier, index); +} + +/** + @brief This API is used to get identifier of group associated with the function + @param identifier of the function + @return pin identifier of function in index +**/ +uint32_t val_pin_control_get_expected_function_associations(uint32_t identifier, uint32_t index) +{ + return pal_pin_control_get_expected_function_associations(identifier, index); +} + +/** +@brief This API is used to check if pin or group is accessible for given agent id + 1. Caller - Test Suite. + @param agent_id agent id + @param identifier The identifier of pin or group + @param selector Selector of pin or group + @return status 0 on access +**/ +uint32_t val_pinctrl_check_access(uint32_t agent_id, uint32_t identifier, uint32_t selector) +{ + return pal_pinctrl_check_access(agent_id, identifier, selector); +} +#endif diff --git a/val/val_power_domain.c b/val/val_power_domain.c index 0f0b198b6dc309941dafdfdc7c2fe65bd8a0c488..63000461c58fb083c099ecda1bdcb3c3d1022c5f 100644 --- a/val/val_power_domain.c +++ b/val/val_power_domain.c @@ -50,13 +50,20 @@ uint32_t val_power_domain_execute_tests(void) RUN_TEST(power_domain_power_state_notify_unspported_domain_check()); RUN_TEST(power_domain_power_state_notify_invalid_domain_check()); - if (val_protocol_version_relaxed(PROTOCOL_POWER_DOMAIN, version, POWER_PROTOCOL_VERSION_2)) { + if (val_protocol_version_relaxed(PROTOCOL_POWER_DOMAIN, version, + POWER_PROTOCOL_VERSION_2)) { RUN_TEST(power_domain_power_state_change_requested_notify_check()); RUN_TEST(power_domain_power_state_change_requested_notify_invalid_domain_check()); } - if (val_protocol_version_relaxed(PROTOCOL_POWER_DOMAIN, version, POWER_PROTOCOL_VERSION_2_1)) { + if (val_protocol_version_relaxed(PROTOCOL_POWER_DOMAIN, version, + POWER_PROTOCOL_VERSION_2_1)) { RUN_TEST(power_domain_query_domain_attributes_scmi_v3()); } + if (version == POWER_PROTOCOL_VERSION_3) { + RUN_TEST(power_domain_query_domain_attributes_scmi_v3_1()); + RUN_TEST(power_query_ext_domain_name()); + RUN_TEST(power_query_ext_domain_name_invalid_domain()); + } } else val_print(VAL_PRINT_ERR, "\n Calling agent have no access to POWER DOMAIN protocol"); @@ -98,6 +105,9 @@ void val_power_domain_save_info(uint32_t param_identifier, uint32_t pd_id, uint3 case PD_STATE_SYNC_SUPPORT: g_power_domain_info_table.pd_sync_support[pd_id] = param_value; break; + case PD_EXT_DOMAIN_NAME_SUPP: + g_power_domain_info_table.pd_ext_dmn_name_supp[pd_id] = param_value; + break; default: val_print(VAL_PRINT_WARN, "\nUnidentified parameter %d", param_identifier); } @@ -138,6 +148,9 @@ uint32_t val_power_domain_get_info(uint32_t pd_id, uint32_t param_identifier) case PD_STATE_SYNC_SUPPORT: param_value = g_power_domain_info_table.pd_sync_support[pd_id]; break; + case PD_EXT_DOMAIN_NAME_SUPP: + param_value = g_power_domain_info_table.pd_ext_dmn_name_supp[pd_id]; + break; default: val_print(VAL_PRINT_WARN, "\nUnidentified parameter %d", param_identifier); } diff --git a/val/val_powercap.c b/val/val_powercap.c new file mode 100644 index 0000000000000000000000000000000000000000..35afb09530a7ee827313aaf0f94c5c0adc94554b --- /dev/null +++ b/val/val_powercap.c @@ -0,0 +1,282 @@ +/** @file + * Copyright (c) 2021, 2023-2024, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifdef POWERCAP_PROTOCOL + +#include "val_interface.h" +#include "val_powercap.h" + +static POWERCAP_INFO_s g_powercap_info_table; + +/** + @brief This API is called from app layer to execute powercap tests + @param none + @return test execution result +**/ +uint32_t val_powercap_execute_tests(void) +{ + uint32_t version = 0; + + if (val_agent_check_protocol_support(PROTOCOL_POWERCAP)) { + if (RUN_TEST(powercap_query_protocol_version(&version))) + return VAL_STATUS_FAIL; + + RUN_TEST(powercap_query_protocol_attributes()); + RUN_TEST(powercap_query_mandatory_command_support()); + RUN_TEST(powercap_invalid_messageid_call()); + + if (version >= POWERCAP_PROTOCOL_VERSION_2) + RUN_TEST(powercap_query_domain_attributes_v2()); + else + RUN_TEST(powercap_query_domain_attributes()); + + RUN_TEST(powercap_query_domain_attributes_invalid_id()); + RUN_TEST(powercap_query_get_powercap_value()); + RUN_TEST(powercap_query_invalid_domain_id()); + RUN_TEST(powercap_set_power_cap_value()); + RUN_TEST(powercap_invalid_domain_set_power_cap_value()); + RUN_TEST(powercap_invalid_data_set_power_cap_value()); + RUN_TEST(powercap_query_get_pai_value()); + RUN_TEST(powercap_query_pai_invalid_domain_id()); + RUN_TEST(powercap_set_pai_value()); + RUN_TEST(powercap_invalid_domain_set_pai_value()); + RUN_TEST(powercap_query_domain_name()); + RUN_TEST(powercap_query_measurement()); + RUN_TEST(powercap_cap_notification_query()); + RUN_TEST(powercap_measurement_notification_query()); + RUN_TEST(powercap_query_describe_fast_channel()); + RUN_TEST(powercap_query_describe_fast_channel_invalid_domain()); + RUN_TEST(powercap_query_describe_fast_channel_invalid_message()); + RUN_TEST(powercap_query_describe_fast_channel_unsupported_domain()); + RUN_TEST(powercap_invalid_data_set_pai_value()); + RUN_TEST(powercap_query_domain_name_invalid_domain()); + RUN_TEST(powercap_cap_notification_invalid_query()); + RUN_TEST(powercap_measurement_notification_invalid_query()); + + } else + val_print(VAL_PRINT_ERR, "\n Calling agent have no access to Powercap protocol"); + + return VAL_STATUS_PASS; +} + + +/** + @brief This API is used for checking num of powercap domain + @param none + @return num of powercap domain +**/ +uint32_t val_powercap_get_expected_num_domains(void) +{ + return pal_powercap_get_expected_num_domains(); +} + +/** + @brief This API is used to set powercap protocol info + 1. Caller - Test Suite. + 2. Prerequisite - Powercap protocol info table. + @param param_identifier id of parameter which will be set + @param domain_id powercap domain ID. + @param param_value value of parameter + @return none +**/ +void val_powercap_save_info(uint32_t param_identifier, uint32_t domain_id, uint32_t param_value) +{ + switch (param_identifier) + { + case NUM_POWERCAP_DOMAINS: + g_powercap_info_table.num_domains = param_value; + break; + case POWERCAP_ATTRIBUTES: + g_powercap_info_table.domain_info[domain_id].attributes = param_value; + break; + case POWERCAP_POWERCAP: + g_powercap_info_table.domain_info[domain_id].powercap = param_value; + break; + case POWERCAP_PAI: + g_powercap_info_table.domain_info[domain_id].pai = param_value; + break; + case POWERCAP_MIN_POWER: + g_powercap_info_table.domain_info[domain_id].min_power = param_value; + break; + case POWERCAP_MAX_POWER: + g_powercap_info_table.domain_info[domain_id].max_power = param_value; + break; + case POWERCAP_MSG_FAST_CHNL_SUPP: + switch (domain_id) + { + case POWERCAP_CAP_GET: + g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_cap_get = param_value; + break; + case POWERCAP_CAP_SET: + g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_cap_set = param_value; + break; + case POWERCAP_PAI_GET: + g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_pai_get = param_value; + break; + case POWERCAP_PAI_SET: + g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_pai_set = param_value; + break; + default: + val_print(VAL_PRINT_ERR, "\nUnidentified Command %d,parameter identifier = %d", + domain_id, param_identifier); + } + break; + default: + val_print(VAL_PRINT_ERR, "\nUnidentified parameter %d", param_identifier); + } +} + + +/** + @brief This API is used to get powercap protocol info + 1. Caller - Test Suite. + 2. Prerequisite - Powercap protocol info table. + @param param_identifier id of parameter which will be set + @return param_value value of the parameter +**/ +uint32_t val_powercap_get_info(uint32_t param_identifier, uint32_t domain_id) +{ + uint32_t param_value = 0; + + switch (param_identifier) + { + case NUM_POWERCAP_DOMAINS: + param_value = g_powercap_info_table.num_domains; + break; + case POWERCAP_ATTRIBUTES: + param_value = g_powercap_info_table.domain_info[domain_id].attributes; + break; + case POWERCAP_POWERCAP: + param_value = g_powercap_info_table.domain_info[domain_id].powercap; + break; + case POWERCAP_PAI: + param_value = g_powercap_info_table.domain_info[domain_id].pai; + break; + case POWERCAP_MIN_POWER: + param_value = g_powercap_info_table.domain_info[domain_id].min_power; + break; + case POWERCAP_MAX_POWER: + param_value = g_powercap_info_table.domain_info[domain_id].max_power; + break; + case POWERCAP_MSG_FAST_CHNL_SUPP: + switch (domain_id) + { + case POWERCAP_CAP_GET: + param_value = g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_cap_get; + break; + case POWERCAP_CAP_SET: + param_value = g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_cap_set; + break; + case POWERCAP_PAI_GET: + param_value = g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_pai_get; + break; + case POWERCAP_PAI_SET: + param_value = g_powercap_info_table.pc_cmd_fast_ch_supp.powercap_pai_set; + break; + default: + val_print(VAL_PRINT_ERR, "\nUnidentified Command %d,parameter identifier = %d", + domain_id, param_identifier); + } + break; + default: + val_print(VAL_PRINT_ERR, "\nUnidentified parameter %d", param_identifier); + } + + return param_value; +} + +/** + @brief This API is used for checking powercap domain name + @param domain id + @return powercap domain name +**/ +uint8_t *val_powercap_get_expected_name(uint32_t domain_id) +{ + return pal_powercap_get_expected_name(domain_id); +} + + +/** + @brief This API is used to get saved power cap domain attribute. + @param domain_id domain ID + @return attribute value +**/ +uint32_t val_get_domain_powercap_attribute(uint32_t domain_id, uint32_t flag) +{ + uint32_t attribute; + + attribute = val_powercap_get_info(POWERCAP_ATTRIBUTES, domain_id); + return val_get_powercap_attributes_flag(attribute, flag); +} + + +/** + @breif This API is used to get configuration flags from domain attributes + @param attribute attribute value for domain + @param flag powercap attribute flag. + @return flag value +**/ +uint32_t val_get_powercap_attributes_flag(uint32_t attribute, uint32_t flag) +{ + uint32_t flag_value = 0; + + switch (flag) + { + case PC_CHANGE_NOTIFY_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 31, 31); + break; + case PC_MEASUR_CHANG_NOTIFY_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 30, 30); + break; + case PC_ASYNC_PC_SET_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 29, 29); + break; + case PC_EXTENDED_NAME: + flag_value = VAL_EXTRACT_BITS(attribute, 28, 28); + break; + case PC_CONFIG_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 27, 27); + break; + case PC_POWER_MONITOR_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 26, 26); + break; + case PC_PAI_CONFIG_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 25, 25); + break; + case PC_POWER_UNIT: + flag_value = VAL_EXTRACT_BITS(attribute, 23, 24); + break; + case PC_FASTCHANNEL_SUPPORT: + flag_value = VAL_EXTRACT_BITS(attribute, 22, 22); + break; + default: + val_print(VAL_PRINT_ERR, "\nUnidentified parameter %d", flag); + } + + return flag_value; +} + +uint32_t val_get_cap_set_flag(uint32_t async_resp_mode, uint32_t ignore_resp_mode) +{ + uint32_t flag = 0; + + flag = flag | (async_resp_mode << 1); + flag = flag | ignore_resp_mode; + + return flag; +} +#endif diff --git a/val/val_reset.c b/val/val_reset.c index 3cef9484dd7612f8ab060855c301bddfdb208624..3d478e6418d581a9811b5a0e858556883fcbdb38 100644 --- a/val/val_reset.c +++ b/val/val_reset.c @@ -50,6 +50,12 @@ uint32_t val_reset_execute_tests(void) if (val_protocol_version_relaxed(PROTOCOL_RESET, version, RESET_PROTOCOL_VERSION_2)) { RUN_TEST(reset_query_domain_attributes_scmi_v3()); } + + if (version == RESET_PROTOCOL_VERSION_3) { + RUN_TEST(reset_query_domain_attributes_scmi_v3_1()); + RUN_TEST(reset_query_ext_domain_name()); + RUN_TEST(reset_query_ext_domain_name_invalid_domain()); + } } else val_print(VAL_PRINT_ERR, "\n Calling agent have no access to RESET protocol"); @@ -80,6 +86,10 @@ void val_reset_save_info(uint32_t param_identifier, uint32_t domain_id, uint32_t g_reset_info_table.domain_info[domain_id].notify_support = param_value; break; + case RESET_EXTENDED_NAME_SUPPORT: + g_reset_info_table.domain_info[domain_id].extended_name_supp = + param_value; + break; default: val_print(VAL_PRINT_ERR, "\nUnidentified parameter %d", param_identifier); } @@ -107,6 +117,9 @@ uint32_t val_reset_get_info(uint32_t param_identifier, uint32_t domain_id) case RESET_NOTIFY_SUPPORT: param_value = g_reset_info_table.domain_info[domain_id].notify_support; break; + case RESET_EXTENDED_NAME_SUPPORT: + param_value = g_reset_info_table.domain_info[domain_id].extended_name_supp; + break; default: val_print(VAL_PRINT_ERR, "\nUnidentified parameter %d", param_identifier); } diff --git a/val/val_sensor.c b/val/val_sensor.c index 6368f552f0676992a7415d026e30cd088dce74f1..1cf34bf70f0456e9916be4d01747f0f423f450d8 100644 --- a/val/val_sensor.c +++ b/val/val_sensor.c @@ -70,6 +70,12 @@ uint32_t val_sensor_execute_tests(void) RUN_TEST(sensor_request_sensor_notification_check()); RUN_TEST(sensor_request_notification_invalid_id_check()); } + if (version == SENSOR_PROTOCOL_VERSION_3) { + RUN_TEST(sensor_query_description_get_scmi_v3_1()); + RUN_TEST(sensor_query_ext_domain_name()); + RUN_TEST(sensor_query_domain_ext_name_invalid_domain()); + } + } else val_print(VAL_PRINT_ERR, "\n Calling agent have no access to SENSOR protocol"); @@ -246,6 +252,9 @@ void val_sensor_ext_save_desc_info(uint32_t param_identifier, uint32_t sensor_id case SENSOR_CONT_NOTIFY_UPDATE_SUPPORT: g_sensor_info_table.ext_desc_info[sensor_id].cont_update_notify_support = param_value; break; + case SENSOR_EXTENDED_NAME_SUPPORT: + g_sensor_info_table.ext_desc_info[sensor_id].extended_name_support = param_value; + break; case SENSOR_TIMESTAMP_SUPPORT: g_sensor_info_table.ext_desc_info[sensor_id].timestamp_support = param_value; break; @@ -279,6 +288,9 @@ uint32_t val_sensor_ext_get_desc_info(uint32_t param_identifier, uint32_t sensor case SENSOR_CONT_NOTIFY_UPDATE_SUPPORT: param_value = g_sensor_info_table.ext_desc_info[sensor_id].cont_update_notify_support; break; + case SENSOR_EXTENDED_NAME_SUPPORT: + param_value = g_sensor_info_table.ext_desc_info[sensor_id].extended_name_support; + break; case SENSOR_TIMESTAMP_SUPPORT: param_value = g_sensor_info_table.ext_desc_info[sensor_id].timestamp_support; break; diff --git a/val/val_voltage.c b/val/val_voltage.c index 100b9207ea68cf61f4a1c45e8e2178d94577e71b..3188ec1e0410e437d915f2f98e636c1417030e26 100644 --- a/val/val_voltage.c +++ b/val/val_voltage.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023-2024, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -38,7 +38,11 @@ uint32_t val_voltage_execute_tests(void) RUN_TEST(voltage_query_protocol_attributes()); RUN_TEST(voltage_query_mandatory_command_support()); RUN_TEST(voltage_invalid_messageid_call()); - RUN_TEST(voltage_query_domain_attributes()); + if (version == VOLTAGE_PROTOCOL_VERSION_2) + RUN_TEST(voltage_query_domain_attributes_v2()); + else + RUN_TEST(voltage_query_domain_attributes()); + RUN_TEST(voltage_query_domain_attributes_invalid_id()); RUN_TEST(voltage_query_describe_levels()); RUN_TEST(voltage_query_describe_level_invalid_voltage_id()); @@ -50,6 +54,12 @@ uint32_t val_voltage_execute_tests(void) RUN_TEST(voltage_set_invalid_voltage_level()); RUN_TEST(voltage_query_current_level()); + if (version == VOLTAGE_PROTOCOL_VERSION_2) { + RUN_TEST(voltage_query_domain_ext_name_invalid_domain()); + RUN_TEST(voltage_query_ext_domain_name()); + RUN_TEST(voltage_set_voltage_level_v2()); + } + } else val_print(VAL_PRINT_ERR, "\n Calling agent have no access to Voltage protocol"); @@ -87,6 +97,9 @@ void val_voltage_save_info(uint32_t param_identifier, uint32_t domain_id, uint32 case VOLTAGE_DOMAIN_CONFIG: g_voltage_info_table.domain_info[domain_id].config = param_value; break; + case VOLTAGE_ATTRIBUTES: + g_voltage_info_table.domain_info[domain_id].attributes = param_value; + break; case VOLTAGE_LEVEL_FORMAT: g_voltage_info_table.domain_info[domain_id].voltage_level_format = param_value; break; @@ -152,6 +165,9 @@ uint32_t val_voltage_get_info(uint32_t param_identifier, uint32_t domain_id) case VOLTAGE_DOMAIN_CONFIG: param_value = g_voltage_info_table.domain_info[domain_id].config; break; + case VOLTAGE_ATTRIBUTES: + param_value = g_voltage_info_table.domain_info[domain_id].attributes; + break; case VOLTAGE_LEVEL_FORMAT: param_value = g_voltage_info_table.domain_info[domain_id].voltage_level_format; break; @@ -196,4 +212,44 @@ uint32_t val_voltage_operating_mode_create(uint32_t mode_type, uint32_t mode_id) return config; } + +/** + @brief This API is used to get saved VOLTAGE domain attribute. + @param domain_id domain ID + @return attribute value +**/ +uint32_t val_get_domain_voltage_attribute(uint32_t domain_id, uint32_t flag) +{ + uint32_t attribute; + + attribute = val_voltage_get_info(VOLTAGE_ATTRIBUTES, domain_id); + return val_get_voltage_attributes_flag(attribute, flag); +} + + +/** + @breif This API is used to get configuration flags from domain attributes + @param attribute attribute value for domain + @param flag voltage attribute flag. + @return flag value +**/ +uint32_t val_get_voltage_attributes_flag(uint32_t attribute, uint32_t flag) +{ + uint32_t flag_value = 0; + + switch (flag) + { + case ASYNC_VOLTAGE_SET_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 31, 31); + break; + case EXTENDED_NAME_SUPP: + flag_value = VAL_EXTRACT_BITS(attribute, 30, 30); + break; + default: + val_print(VAL_PRINT_ERR, "\nUnidentified parameter %d", flag); + } + + return flag_value; +} + #endif