#!/bin/sh
#
# PM-QA validation test suite for the power management on Linux
#
# Copyright (C) 2015, Linaro Limited.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#
# Contributors:
#     Larry Bassel <larry.bassel@linaro.org>
#

# URL : https://wiki.linaro.org/WorkingGroups/PowerManagement/Resources/TestSuite/PmQaSpecification#cputopology_03

. ./functions.sh

is_flag_set() {
    flag=$1
    mask=$2
    message=$3

    value=$(( $flag & $mask ))

    if [ $value -ne 0 ]; then
       echo "$message set"
    else 
       echo "$message not set"
    fi
}

check_sched_domain_flags() {

    cpu_num=$1
    domain_num=$2

    sched_domain_flags=/proc/sys/kernel/sched_domain/$cpu_num/domain$domain_num/flags
    val=$(cat $sched_domain_flags)

    check "sched_domain_flags (domain $domain_num)" "test \"$val\" != \"-1\""
    printf "domain$domain_num flag 0x%x\n" $val

    is_flag_set $val  0x80  "domain$domain_num share cpu capacity flag"
    is_flag_set $val  0x100  "domain$domain_num share power domain flag"
    is_flag_set $val  0x200  "domain$domain_num share cpu package resources flag"
}

check_all_sched_domain_flags() {

    n=0

    if ! [ -d /proc/sys/kernel/sched_domain/cpu0 ]; then
       return
    fi

    while [ -e /proc/sys/kernel/sched_domain/$1/domain$n/flags ]; do
        check_sched_domain_flags $1 $n
   n=$(( n + 1))
    done
}

for_each_cpu check_all_sched_domain_flags 1 || exit 1
test_status_show
