diff options
Diffstat (limited to 'meta-ibm/recipes-phosphor/dbus')
19 files changed, 4759 insertions, 0 deletions
diff --git a/meta-ibm/recipes-phosphor/dbus/events-policy.bb b/meta-ibm/recipes-phosphor/dbus/events-policy.bb new file mode 100644 index 000000000..52cb31313 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/events-policy.bb @@ -0,0 +1,17 @@ +SUMMARY = "Event policy configuration for meta-witherspoon machines" +PR = "r1" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit allarch +inherit phosphor-dbus-monitor + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" + +SRC_URI += "file://config.yaml" + +do_install() { + install -D ${WORKDIR}/config.yaml ${D}${config_dir}/config.yaml +} + +FILES_${PN} += "${config_dir}/config.yaml" diff --git a/meta-ibm/recipes-phosphor/dbus/events-policy/config.yaml b/meta-ibm/recipes-phosphor/dbus/events-policy/config.yaml new file mode 100644 index 000000000..5c62d45a3 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/events-policy/config.yaml @@ -0,0 +1,133 @@ +- name: occpath group + class: group + group: path + members: + - meta: PATH + path: /org/open_power/control/occ0 + +- name: occproctemp property + class: group + group: property + type: boolean + members: + - interface: org.open_power.OCC.Status + meta: PROPERTY + property: ThrottleProcTemp + +- name: occprocpower property + class: group + group: property + type: boolean + members: + - interface: org.open_power.OCC.Status + meta: PROPERTY + property: ThrottleProcPower + +- name: occmemtemp property + class: group + group: property + type: boolean + members: + - interface: org.open_power.OCC.Status + meta: PROPERTY + property: ThrottleMemTemp + +- name: watch occproctemp + class: watch + watch: property + paths: occpath group + properties: occproctemp property + callback: check occproctemp + +- name: watch occprocpower + class: watch + watch: property + paths: occpath group + properties: occprocpower property + callback: check occprocpower + +- name: watch occmemtemp + class: watch + watch: property + paths: occpath group + properties: occmemtemp property + callback: check occmemtemp + +- name: check occproctemp + class: condition + condition: count + paths: occpath group + properties: occproctemp property + defer: 1000us + callback: create occproctemp event + countop: '==' + countbound: 1 + op: '==' + bound: true + +- name: check occprocpower + class: condition + condition: count + paths: occpath group + properties: occprocpower property + defer: 1000us + callback: create occprocpower event + countop: '==' + countbound: 1 + op: '==' + bound: true + +- name: check occmemtemp + class: condition + condition: count + paths: occpath group + properties: occmemtemp property + defer: 1000us + callback: create occmemtemp event + countop: '==' + countbound: 1 + op: '==' + bound: true + +- name: create occproctemp event + class: callback + callback: event + paths: occpath group + properties: occproctemp property + eventName: occ + eventMessage: "Processor throttled due to an over temperature condition." + +- name: create occprocpower event + class: callback + callback: event + paths: occpath group + properties: occprocpower property + eventName: occ + eventMessage: "Processor throttled due to reaching the power cap limit." + +- name: create occmemtemp event + class: callback + callback: event + paths: occpath group + properties: occmemtemp property + eventName: occ + eventMessage: "Memory throttled due to an over temperature condition." + +- name: errorlog path group + class: group + group: path + members: + - meta: PATH + path: /xyz/openbmc_project/logging + +- name: pathwatch errorlog + class: pathwatch + pathwatch: path + paths: errorlog path group + pathcallback: create errorlog trap + +- name: create errorlog trap + class: pathcallback + pathcallback: eventpath + paths: errorlog path group + eventType: ErrorTrap diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy.bb b/meta-ibm/recipes-phosphor/dbus/fan-policy.bb new file mode 100644 index 000000000..f8355053d --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy.bb @@ -0,0 +1,28 @@ +SUMMARY = "Fan policy configurations for meta-witherspoon machines" +PR = "r1" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit allarch +inherit phosphor-dbus-monitor + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" + +SRC_URI += "file://air-cooled.yaml" +SRC_URI_append_ibm-ac-server = " file://water-cooled.yaml" +SRC_URI += "file://fan-errors.yaml" + +do_install_append_ibm-ac-server() { + install -D ${WORKDIR}/air-cooled.yaml ${D}${config_dir}/air-cooled.yaml + install -D ${WORKDIR}/water-cooled.yaml ${D}${config_dir}/water-cooled.yaml + install -D ${WORKDIR}/fan-errors.yaml ${D}${config_dir}/fan-errors.yaml +} + +do_install_append_mihawk() { + install -D ${WORKDIR}/air-cooled.yaml ${D}${config_dir}/air-cooled.yaml + install -D ${WORKDIR}/fan-errors.yaml ${D}${config_dir}/fan-errors.yaml +} + +FILES_${PN} += "${config_dir}/air-cooled.yaml" +FILES_${PN}_append_ibm-ac-server = " ${config_dir}/water-cooled.yaml" +FILES_${PN} += "${config_dir}/fan-errors.yaml" diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/mihawk/air-cooled.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/mihawk/air-cooled.yaml new file mode 100644 index 000000000..52232e3f0 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/mihawk/air-cooled.yaml @@ -0,0 +1,339 @@ +# Air cooled mihawk fan policy for PDM. +# +# An air cooled mihawk requires a minimum of three functional fans +# enclosures or six functional fan rotors across all enclosures. +# If the number of functional fan enclosures is below three, soft poweroff +# the system, whereas if the number of fan rotors drop below six, an +# immediate hard poweroff of the system occurs. + +- name: fan enclosures + description: > + 'An air cooled mihawk has 6 fan enclosures to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5 + +- name: fan rotors + description: > + 'An air cooled Witherspoon has eight fan rotors to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1/fan1_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1/fan1_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4/fan4_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4/fan4_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5/fan5_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5/fan5_1 + +- name: chassis state + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis air cooled + description: > + 'Monitor the chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch fan present + description: > + 'Trigger logic on fan enclosure presence state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan present + callback: check cooling type + +- name: watch fan functional + description: > + 'Trigger logic on fan enclosure functional state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan functional + callback: check cooling type + +- name: watch fan rotor functional + description: > + 'Trigger logic on fan rotor functional state changes.' + class: watch + watch: property + paths: fan rotors + properties: fan functional + callback: check cooling type + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check cooling type + +- name: watch cooling type + description: > + 'Maintain a cache of the chassis cooling type.' + class: watch + watch: property + paths: chassis + properties: chassis air cooled + +- name: check cooling type + description: > + 'If this condition passes the chassis is air cooled.' + class: condition + condition: count + paths: chassis + properties: chassis air cooled + callback: check power + countop: '==' + countbound: 0 + op: '==' + bound: true + +- name: check power + description: > + 'If the chassis has power, check fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify there are at least three functional fan enclosures and at least + six functional fan rotors, power off if not.' + class: callback + callback: group + members: + - check group presence + - check group functional enclosures + - check group functional rotors + +- name: check group presence + description: > + 'If this condition passes more than one fan has been unplugged + for more than 25 seconds. Shut the system down. Count present + fans rather than non-present fans since the latter would pass + if the fan has not been created for some reason. + + For a more detailed definition of unplugged, consult the documentation + of xyz.openbmc_project.Inventory.Item and/or the documentation + of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan present + defer: 25000000us + callback: log and shutdown + countop: '<' + countbound: 6 + op: '==' + bound: true + +- name: check group functional enclosures + description: > + 'If this condition passes more than one fan enclosure in the group has been + marked as nonfunctional for 25 seconds. Shut the system down. + + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan functional + defer: 25000000us + callback: log and shutdown + countop: '>' + countbound: 1 + op: '==' + bound: false + +- name: check group functional rotors + description: > + 'If this condition passes more than two fan rotors in the group have been + marked as nonfunctional for 25 seconds. Immediately power off. + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan rotors + properties: fan functional + defer: 25000000us + callback: log and poweroff + countop: '>' + countbound: 1 + op: '==' + bound: false + +- name: log and poweroff + description: > + 'Immediately poweroff, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - hard poweroff + - log hard poweroff + - create shutdown error + +- name: log and shutdown + description: > + 'Shut the system down, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - shutdown + - log shutdown + - create shutdown error + +- name: hard poweroff + description: > + 'Immediately power off the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-chassis-hard-poweroff@0.target + type: string + - value: replace + type: string + +- name: shutdown + description: > + 'Shut down the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-host-shutdown@0.target + type: string + - value: replace + type: string + +- name: log hard poweroff + description: > + 'Log a hard poweroff event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Immediate poweroff of system. There are not enough functional fans. + +- name: log shutdown + description: > + 'Log a shutdown event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Request shutdown of system. There are not enough functional fans. + +- name: create shutdown error + description: > + 'Create a Fan Shutdown Error log.' + class: callback + callback: elog + paths: chassis state + properties: chassis powered + error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/mihawk/fan-errors.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/mihawk/fan-errors.yaml new file mode 100644 index 000000000..65cfbeb25 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/mihawk/fan-errors.yaml @@ -0,0 +1,905 @@ +# Witherspoon fan error policy for PDM. +# +# * Create a NotPresent error if fan 0, 1, 2, 3, 4, or 5 is not present for more +# than 20 seconds. +# * Create a Nonfunctional error if fan 0, 1, 2, 3, 4, or 5 is not +# functional for any amount of time. +# +# The system must be powered on in both of these cases. +# Note: An error is created each time the chassis powers on. +# +# * Watch for fans to become both present and functional, and then resolve +# their errors + +- name: fan0 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + +- name: fan1 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + +- name: fan2 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + +- name: fan3 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: fan4 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4 + +- name: fan5 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5 + + +- name: chassis state + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: fan present and functional + description: > + 'Monitor the present and functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis air cooled + description: > + 'The chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check power + +- name: watch fan0 presence + description: > + 'Trigger logic on fan0 presence state changes.' + class: watch + watch: property + paths: fan0 + properties: fan present + callback: check power fan0 presence + +- name: watch fan0 functional + description: > + 'Trigger logic on fan0 functional state changes.' + class: watch + watch: property + paths: fan0 + properties: fan functional + callback: check power fan0 functional + +- name: watch fan1 presence + description: > + 'Trigger logic on fan1 presence state changes.' + class: watch + watch: property + paths: fan1 + properties: fan present + callback: check power fan1 presence + +- name: watch fan1 functional + description: > + 'Trigger logic on fan1 functional state changes.' + class: watch + watch: property + paths: fan1 + properties: fan functional + callback: check power fan1 functional + +- name: watch fan2 presence + description: > + 'Trigger logic on fan2 presence state changes.' + class: watch + watch: property + paths: fan2 + properties: fan present + callback: check power fan2 presence + +- name: watch fan2 functional + description: > + 'Trigger logic on fan2 functional state changes.' + class: watch + watch: property + paths: fan2 + properties: fan functional + callback: check power fan2 functional + +- name: watch fan3 presence + description: > + 'Trigger logic on fan3 presence state changes.' + class: watch + watch: property + paths: fan3 + properties: fan present + callback: check power fan3 presence + +- name: watch fan3 functional + description: > + 'Trigger logic on fan3 functional state changes.' + class: watch + watch: property + paths: fan3 + properties: fan functional + callback: check power fan3 functional + +- name: watch fan4 presence + description: > + 'Trigger logic on fan4 presence state changes.' + class: watch + watch: property + paths: fan4 + properties: fan present + callback: check power fan4 presence + +- name: watch fan4 functional + description: > + 'Trigger logic on fan4 functional state changes.' + class: watch + watch: property + paths: fan4 + properties: fan functional + callback: check power fan4 functional + +- name: watch fan5 presence + description: > + 'Trigger logic on fan5 presence state changes.' + class: watch + watch: property + paths: fan5 + properties: fan present + callback: check power fan5 presence + +- name: watch fan5 functional + description: > + 'Trigger logic on fan5 functional state changes.' + class: watch + watch: property + paths: fan5 + properties: fan functional + callback: check power fan5 functional + +- name: watch fan0 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan0 + properties: fan present and functional + callback: resolve fan0 errors if present and functional + +- name: watch fan1 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan1 + properties: fan present and functional + callback: resolve fan1 errors if present and functional + +- name: watch fan2 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan2 + properties: fan present and functional + callback: resolve fan2 errors if present and functional + +- name: watch fan3 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan3 + properties: fan present and functional + callback: resolve fan3 errors if present and functional + +- name: watch fan4 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan4 + properties: fan present and functional + callback: resolve fan4 errors if present and functional + +- name: watch fan5 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan5 + properties: fan present and functional + callback: resolve fan5 errors if present and functional + +- name: check power + description: > + 'If the chassis has power, check all fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan0 presence + description: > + 'If the chassis has power, check presence of fan0.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan0 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan0 functional + description: > + 'If the chassis has power, check functional of fan0.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan0 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan1 presence + description: > + 'If the chassis has power, check presence of fan1.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan1 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan1 functional + description: > + 'If the chassis has power, check functional of fan1.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan1 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan2 presence + description: > + 'If the chassis has power, check presence of fan2.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan2 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan2 functional + description: > + 'If the chassis has power, check functional of fan2.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan2 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan3 presence + description: > + 'If the chassis has power, check presence of fan3.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan3 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan3 functional + description: > + 'If the chassis has power, check functional of fan3.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan3 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan4 presence + description: > + 'If the chassis has power, check presence of fan4.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan4 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan4 functional + description: > + 'If the chassis has power, check functional of fan4.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan4 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan5 presence + description: > + 'If the chassis has power, check presence of fan5.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan5 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan5 functional + description: > + 'If the chassis has power, check functional of fan5.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan5 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify each of the 12 fans are present.' + class: callback + callback: group + members: + - check fan0 presence + - check fan1 presence + - check fan2 presence + - check fan3 presence + - check fan4 presence + - check fan5 presence + - check fan0 functional + - check fan1 functional + - check fan2 functional + - check fan3 functional + - check fan4 functional + - check fan5 functional + +- name: check fan0 presence + description: > + 'If this condition passes fan0 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan0 + properties: fan present + defer: 20000000us + callback: notpresent fan0 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan0 functional + description: > + 'If this condition passes fan0 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan0 + properties: fan functional + callback: nonfunctional fan0 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan1 presence + description: > + 'If this condition passes fan1 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan1 + properties: fan present + defer: 20000000us + callback: notpresent fan1 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan1 functional + description: > + 'If this condition passes fan1 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan1 + properties: fan functional + callback: nonfunctional fan1 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan2 presence + description: > + 'If this condition passes fan2 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan2 + properties: fan present + defer: 20000000us + callback: notpresent fan2 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan2 functional + description: > + 'If this condition passes fan2 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan2 + properties: fan functional + callback: nonfunctional fan2 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan3 presence + description: > + 'If this condition passes fan3 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan3 + properties: fan present + defer: 20000000us + callback: notpresent fan3 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan3 functional + description: > + 'If this condition passes fan3 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan3 + properties: fan functional + callback: nonfunctional fan3 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan4 presence + description: > + 'If this condition passes fan4 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan4 + properties: fan present + defer: 20000000us + callback: notpresent fan4 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan4 functional + description: > + 'If this condition passes fan4 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan4 + properties: fan functional + callback: nonfunctional fan4 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan5 presence + description: > + 'If this condition passes fan5 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan5 + properties: fan present + defer: 20000000us + callback: notpresent fan5 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan5 functional + description: > + 'If this condition passes fan5 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan5 + properties: fan functional + callback: nonfunctional fan5 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: notpresent fan0 error + class: callback + callback: elog + paths: fan0 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + type: string + +- name: nonfunctional fan0 error + class: callback + callback: elog + paths: fan0 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + type: string + +- name: notpresent fan1 error + class: callback + callback: elog + paths: fan1 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + type: string + +- name: nonfunctional fan1 error + class: callback + callback: elog + paths: fan1 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + type: string + +- name: notpresent fan2 error + class: callback + callback: elog + paths: fan2 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + type: string + +- name: nonfunctional fan2 error + class: callback + callback: elog + paths: fan2 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + type: string + +- name: notpresent fan3 error + class: callback + callback: elog + paths: fan3 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + type: string + +- name: nonfunctional fan3 error + class: callback + callback: elog + paths: fan3 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + type: string + +- name: notpresent fan4 error + class: callback + callback: elog + paths: fan4 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4 + type: string + +- name: nonfunctional fan4 error + class: callback + callback: elog + paths: fan4 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4 + type: string + +- name: notpresent fan5 error + class: callback + callback: elog + paths: fan5 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5 + type: string + +- name: nonfunctional fan5 error + class: callback + callback: elog + paths: fan5 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5 + type: string + +- name: resolve fan0 errors if present and functional + description: > + 'If fan0 is present and functional, call the resolve fan0 errors callback.' + class: condition + condition: count + paths: fan0 + properties: fan present and functional + callback: resolve fan0 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan1 errors if present and functional + description: > + 'If fan1 is present and functional, call the resolve fan1 errors callback.' + class: condition + condition: count + paths: fan1 + properties: fan present and functional + callback: resolve fan1 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan2 errors if present and functional + description: > + 'If fan2 is present and functional, call the resolve fan2 errors callback.' + class: condition + condition: count + paths: fan2 + properties: fan present and functional + callback: resolve fan2 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan3 errors if present and functional + description: > + 'If fan3 is present and functional, call the resolve fan3 errors callback.' + class: condition + condition: count + paths: fan3 + properties: fan present and functional + callback: resolve fan3 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan4 errors if present and functional + description: > + 'If fan4 is present and functional, call the resolve fan4 errors callback.' + class: condition + condition: count + paths: fan4 + properties: fan present and functional + callback: resolve fan4 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan5 errors if present and functional + description: > + 'If fan5 is present and functional, call the resolve fan5 errors callback.' + class: condition + condition: count + paths: fan5 + properties: fan present and functional + callback: resolve fan5 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan0 errors + class: callback + callback: resolve callout + paths: fan0 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + +- name: resolve fan1 errors + class: callback + callback: resolve callout + paths: fan1 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + +- name: resolve fan2 errors + class: callback + callback: resolve callout + paths: fan2 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + +- name: resolve fan3 errors + class: callback + callback: resolve callout + paths: fan3 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: resolve fan4 errors + class: callback + callback: resolve callout + paths: fan4 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4 + +- name: resolve fan5 errors + class: callback + callback: resolve callout + paths: fan5 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5 diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/air-cooled.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/air-cooled.yaml new file mode 100644 index 000000000..bfdcd1bb6 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/air-cooled.yaml @@ -0,0 +1,274 @@ +# Air cooled Swift fan policy for PDM. +# +# An air cooled Swift requires a minimum of three functional fan enclosures. +# If the number of functional fan enclosures is below three, soft poweroff +# the system. + +- name: fan enclosures + description: > + 'An air cooled Swift has four fan enclosures to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: chassis state + description: > + 'Swift has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Swift has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis air cooled + description: > + 'Monitor the chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch fan present + description: > + 'Trigger logic on fan enclosure presence state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan present + callback: check cooling type + +- name: watch fan functional + description: > + 'Trigger logic on fan enclosure functional state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan functional + callback: check cooling type + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check cooling type + +- name: watch cooling type + description: > + 'Maintain a cache of the chassis cooling type.' + class: watch + watch: property + paths: chassis + properties: chassis air cooled + +- name: check cooling type + description: > + 'If this condition passes the chassis is air cooled.' + class: condition + condition: count + paths: chassis + properties: chassis air cooled + callback: check power + countop: '==' + countbound: 0 + op: '==' + bound: true + +- name: check power + description: > + 'If the chassis has power, check fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify there are at least three functional fan enclosures, + power off if not.' + class: callback + callback: group + members: + - check group presence + - check group functional enclosures + +- name: check group presence + description: > + 'If this condition passes more than one fan has been unplugged + for more than 25 seconds. Shut the system down. Count present + fans rather than non-present fans since the latter would pass + if the fan has not been created for some reason. + + For a more detailed definition of unplugged, consult the documentation + of xyz.openbmc_project.Inventory.Item and/or the documentation + of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan present + defer: 25000000us + callback: log and shutdown + countop: '<' + countbound: 3 + op: '==' + bound: true + +- name: check group functional enclosures + description: > + 'If this condition passes more than one fan enclosure in the group has been + marked as nonfunctional for five seconds. Shut the system down. + + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan functional + defer: 5000000us + callback: log and shutdown + countop: '>' + countbound: 1 + op: '==' + bound: false + +- name: log and poweroff + description: > + 'Immediately poweroff, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - hard poweroff + - log hard poweroff + - create shutdown error + +- name: log and shutdown + description: > + 'Shut the system down, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - shutdown + - log shutdown + - create shutdown error + +- name: hard poweroff + description: > + 'Immediately power off the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-chassis-hard-poweroff@0.target + type: string + - value: replace + type: string + +- name: shutdown + description: > + 'Shut down the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-host-shutdown@0.target + type: string + - value: replace + type: string + +- name: log hard poweroff + description: > + 'Log a hard poweroff event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Immediate poweroff of system. There are not enough functional fans. + +- name: log shutdown + description: > + 'Log a shutdown event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Request shutdown of system. There are not enough functional fans. + +- name: create shutdown error + description: > + 'Create a Fan Shutdown Error log.' + class: callback + callback: elog + paths: chassis state + properties: chassis powered + error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/fan-errors.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/fan-errors.yaml new file mode 100644 index 000000000..794d91f17 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/fan-errors.yaml @@ -0,0 +1,671 @@ +# Swift fan error policy for PDM. +# +# * Create a NotPresent error if fan 0, 1, 2, or 3 is not present for more +# than 20 seconds. +# * Create a Nonfunctional error if fan 0, 1, 2, or 3 is not +# functional for any amount of time. +# +# The system must be powered on in both of these cases. +# Note: An error is created each time the chassis powers on. +# +# * Watch for fans to become both present and functional, and then resolve +# their errors + +- name: fan0 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + +- name: fan1 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + +- name: fan2 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + +- name: fan3 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: chassis state + description: > + 'Swift has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Swift has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: fan present and functional + description: > + 'Monitor the present and functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis air cooled + description: > + 'The chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check power + +- name: watch fan0 presence + description: > + 'Trigger logic on fan0 presence state changes.' + class: watch + watch: property + paths: fan0 + properties: fan present + callback: check power fan0 presence + +- name: watch fan0 functional + description: > + 'Trigger logic on fan0 functional state changes.' + class: watch + watch: property + paths: fan0 + properties: fan functional + callback: check power fan0 functional + +- name: watch fan1 presence + description: > + 'Trigger logic on fan1 presence state changes.' + class: watch + watch: property + paths: fan1 + properties: fan present + callback: check power fan1 presence + +- name: watch fan1 functional + description: > + 'Trigger logic on fan1 functional state changes.' + class: watch + watch: property + paths: fan1 + properties: fan functional + callback: check power fan1 functional + +- name: watch fan2 presence + description: > + 'Trigger logic on fan2 presence state changes.' + class: watch + watch: property + paths: fan2 + properties: fan present + callback: check power fan2 presence + +- name: watch fan2 functional + description: > + 'Trigger logic on fan2 functional state changes.' + class: watch + watch: property + paths: fan2 + properties: fan functional + callback: check power fan2 functional + +- name: watch fan3 presence + description: > + 'Trigger logic on fan3 presence state changes.' + class: watch + watch: property + paths: fan3 + properties: fan present + callback: check power fan3 presence + +- name: watch fan3 functional + description: > + 'Trigger logic on fan3 functional state changes.' + class: watch + watch: property + paths: fan3 + properties: fan functional + callback: check power fan3 functional + +- name: watch fan0 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan0 + properties: fan present and functional + callback: resolve fan0 errors if present and functional + +- name: watch fan1 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan1 + properties: fan present and functional + callback: resolve fan1 errors if present and functional + +- name: watch fan2 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan2 + properties: fan present and functional + callback: resolve fan2 errors if present and functional + +- name: watch fan3 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan3 + properties: fan present and functional + callback: resolve fan3 errors if present and functional + +- name: check power + description: > + 'If the chassis has power, check all fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan0 presence + description: > + 'If the chassis has power, check presence of fan0.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan0 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan0 functional + description: > + 'If the chassis has power, check functional of fan0.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan0 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan1 presence + description: > + 'If the chassis has power, check presence of fan1.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan1 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan1 functional + description: > + 'If the chassis has power, check functional of fan1.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan1 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan2 presence + description: > + 'If the chassis has power, check presence of fan2.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan2 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan2 functional + description: > + 'If the chassis has power, check functional of fan2.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan2 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan3 presence + description: > + 'If the chassis has power, check presence of fan3.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan3 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan3 functional + description: > + 'If the chassis has power, check functional of fan3.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan3 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify each of the 3 fans are present.' + class: callback + callback: group + members: + - check fan0 presence + - check fan1 presence + - check fan2 presence + - check fan3 presence + - check fan0 functional + - check fan1 functional + - check fan2 functional + - check fan3 functional + +- name: check fan0 presence + description: > + 'If this condition passes fan0 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan0 + properties: fan present + defer: 20000000us + callback: notpresent fan0 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan0 functional + description: > + 'If this condition passes fan0 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan0 + properties: fan functional + callback: nonfunctional fan0 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan1 presence + description: > + 'If this condition passes fan1 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan1 + properties: fan present + defer: 20000000us + callback: notpresent fan1 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan1 functional + description: > + 'If this condition passes fan1 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan1 + properties: fan functional + callback: nonfunctional fan1 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan2 presence + description: > + 'If this condition passes fan2 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan2 + properties: fan present + defer: 20000000us + callback: notpresent fan2 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan2 functional + description: > + 'If this condition passes fan2 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan2 + properties: fan functional + callback: nonfunctional fan2 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan3 presence + description: > + 'If this condition passes fan3 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan3 + properties: fan present + defer: 20000000us + callback: notpresent fan3 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan3 functional + description: > + 'If this condition passes fan3 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan3 + properties: fan functional + callback: nonfunctional fan3 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check cooling type nonfunctional error + description: > + 'If this condition passes the chassis is air cooled and will create a + nonfunctional error for fan 1.' + class: condition + condition: count + paths: chassis + properties: chassis air cooled + callback: nonfunctional fan1 error + countop: '==' + countbound: 0 + op: '==' + bound: true + +- name: check cooling type notpresent error + description: > + 'If this condition passes the chassis is air cooled and will create a + notpresent error for fan 1.' + class: condition + condition: count + paths: chassis + properties: chassis air cooled + callback: notpresent fan1 error + countop: '==' + countbound: 0 + op: '==' + bound: true + +- name: notpresent fan0 error + class: callback + callback: elog + paths: fan0 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + type: string + +- name: nonfunctional fan0 error + class: callback + callback: elog + paths: fan0 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + type: string + +- name: notpresent fan1 error + class: callback + callback: elog + paths: fan1 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + type: string + +- name: nonfunctional fan1 error + class: callback + callback: elog + paths: fan1 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + type: string + +- name: notpresent fan2 error + class: callback + callback: elog + paths: fan2 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + type: string + +- name: nonfunctional fan2 error + class: callback + callback: elog + paths: fan2 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + type: string + +- name: notpresent fan3 error + class: callback + callback: elog + paths: fan3 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + type: string + +- name: nonfunctional fan3 error + class: callback + callback: elog + paths: fan3 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + type: string + +- name: resolve fan0 errors if present and functional + description: > + 'If fan0 is present and functional, call the resolve fan0 errors callback.' + class: condition + condition: count + paths: fan0 + properties: fan present and functional + callback: resolve fan0 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +#Go ahead and do this on water cooled as well +- name: resolve fan1 errors if present and functional + description: > + 'If fan1 is present and functional, call the resolve fan1 errors callback.' + class: condition + condition: count + paths: fan1 + properties: fan present and functional + callback: resolve fan1 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan2 errors if present and functional + description: > + 'If fan2 is present and functional, call the resolve fan2 errors callback.' + class: condition + condition: count + paths: fan2 + properties: fan present and functional + callback: resolve fan2 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan3 errors if present and functional + description: > + 'If fan3 is present and functional, call the resolve fan3 errors callback.' + class: condition + condition: count + paths: fan3 + properties: fan present and functional + callback: resolve fan3 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan0 errors + class: callback + callback: resolve callout + paths: fan0 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + +- name: resolve fan1 errors + class: callback + callback: resolve callout + paths: fan1 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + +- name: resolve fan2 errors + class: callback + callback: resolve callout + paths: fan2 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + +- name: resolve fan3 errors + class: callback + callback: resolve callout + paths: fan3 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/water-cooled.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/water-cooled.yaml new file mode 100644 index 000000000..661021a9b --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/swift/water-cooled.yaml @@ -0,0 +1,274 @@ +# Water cooled Swift fan policy for PDM. +# +# A water cooled Swift requires a minimum of three functional fan +# enclosures. If the number of functional fan enclosures is below three, +# soft poweroff the system. + +- name: fan enclosures + description: > + 'A water cooled Swift has four fan enclosures to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: chassis state + description: > + 'Swift has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Swift has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis water cooled + description: > + 'Monitor the chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch fan present + description: > + 'Trigger logic on fan enclosure presence state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan present + callback: check cooling type + +- name: watch fan functional + description: > + 'Trigger logic on fan enclosure functional state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan functional + callback: check cooling type + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check cooling type + +- name: watch cooling type + description: > + 'Maintain a cache of the chassis cooling type.' + class: watch + watch: property + paths: chassis + properties: chassis water cooled + +- name: check cooling type + description: > + 'If this condition passes the chassis is water cooled.' + class: condition + condition: count + paths: chassis + properties: chassis water cooled + callback: check power + countop: '==' + countbound: 1 + op: '==' + bound: true + +- name: check power + description: > + 'If the chassis has power, check fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify there are at least three functional fan enclosures, + power off if not.' + class: callback + callback: group + members: + - check group presence + - check group functional enclosures + +- name: check group presence + description: > + 'If this condition passes more than one fan has been unplugged + for more than 25 seconds. Shut the system down. Count present + fans rather than non-present fans since the latter would pass + if the fan has not been created for some reason. + + For a more detailed definition of unplugged, consult the documentation + of xyz.openbmc_project.Inventory.Item and/or the documentation + of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan present + defer: 25000000us + callback: log and shutdown + countop: '<' + countbound: 3 + op: '==' + bound: true + +- name: check group functional enclosures + description: > + 'If this condition passes more than one fan enclosure in the group has been + marked as nonfunctional for five seconds. Shut the system down. + + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan functional + defer: 5000000us + callback: log and shutdown + countop: '>' + countbound: 1 + op: '==' + bound: false + +- name: log and poweroff + description: > + 'Immediately poweroff, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - hard poweroff + - log hard poweroff + - create shutdown error + +- name: log and shutdown + description: > + 'Shut the system down, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - shutdown + - log shutdown + - create shutdown error + +- name: hard poweroff + description: > + 'Immediately power off the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-chassis-hard-poweroff@0.target + type: string + - value: replace + type: string + +- name: shutdown + description: > + 'Shut down the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-host-shutdown@0.target + type: string + - value: replace + type: string + +- name: log hard poweroff + description: > + 'Log a hard poweroff event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Immediate poweroff of system. There are not enough functional fans. + +- name: log shutdown + description: > + 'Log a shutdown event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Request shutdown of system. There are not enough functional fans. + +- name: create shutdown error + description: > + 'Create a Fan Shutdown Error log.' + class: callback + callback: elog + paths: chassis state + properties: chassis powered + error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/air-cooled.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/air-cooled.yaml new file mode 100644 index 000000000..d60aa9179 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/air-cooled.yaml @@ -0,0 +1,328 @@ +# Air cooled Witherspoon fan policy for PDM. +# +# An air cooled Witherspoon requires a minimum of three functional fans +# enclosures or six functional fan rotors across all enclosures. +# If the number of functional fan enclosures is below three, soft poweroff +# the system, whereas if the number of fan rotors drop below six, an +# immediate hard poweroff of the system occurs. + +- name: fan enclosures + description: > + 'An air cooled Witherspoon has four fan enclosures to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: fan rotors + description: > + 'An air cooled Witherspoon has eight fan rotors to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1/fan1_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1/fan1_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_1 + +- name: chassis state + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis air cooled + description: > + 'Monitor the chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch fan present + description: > + 'Trigger logic on fan enclosure presence state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan present + callback: check cooling type + +- name: watch fan functional + description: > + 'Trigger logic on fan enclosure functional state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan functional + callback: check cooling type + +- name: watch fan rotor functional + description: > + 'Trigger logic on fan rotor functional state changes.' + class: watch + watch: property + paths: fan rotors + properties: fan functional + callback: check cooling type + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check cooling type + +- name: watch cooling type + description: > + 'Maintain a cache of the chassis cooling type.' + class: watch + watch: property + paths: chassis + properties: chassis air cooled + +- name: check cooling type + description: > + 'If this condition passes the chassis is air cooled.' + class: condition + condition: count + paths: chassis + properties: chassis air cooled + callback: check power + countop: '==' + countbound: 0 + op: '==' + bound: true + +- name: check power + description: > + 'If the chassis has power, check fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify there are at least three functional fan enclosures and at least + six functional fan rotors, power off if not.' + class: callback + callback: group + members: + - check group presence + - check group functional enclosures + - check group functional rotors + +- name: check group presence + description: > + 'If this condition passes more than one fan has been unplugged + for more than 25 seconds. Shut the system down. Count present + fans rather than non-present fans since the latter would pass + if the fan has not been created for some reason. + + For a more detailed definition of unplugged, consult the documentation + of xyz.openbmc_project.Inventory.Item and/or the documentation + of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan present + defer: 25000000us + callback: log and shutdown + countop: '<' + countbound: 3 + op: '==' + bound: true + +- name: check group functional enclosures + description: > + 'If this condition passes more than one fan enclosure in the group has been + marked as nonfunctional for five seconds. Shut the system down. + + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan functional + defer: 5000000us + callback: log and shutdown + countop: '>' + countbound: 1 + op: '==' + bound: false + +- name: check group functional rotors + description: > + 'If this condition passes more than two fan rotors in the group have been + marked as nonfunctional for five seconds. Immediately power off. + + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan rotors + properties: fan functional + defer: 5000000us + callback: log and poweroff + countop: '>' + countbound: 2 + op: '==' + bound: false + +- name: log and poweroff + description: > + 'Immediately poweroff, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - hard poweroff + - log hard poweroff + - create shutdown error + +- name: log and shutdown + description: > + 'Shut the system down, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - shutdown + - log shutdown + - create shutdown error + +- name: hard poweroff + description: > + 'Immediately power off the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-chassis-hard-poweroff@0.target + type: string + - value: replace + type: string + +- name: shutdown + description: > + 'Shut down the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-host-shutdown@0.target + type: string + - value: replace + type: string + +- name: log hard poweroff + description: > + 'Log a hard poweroff event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Immediate poweroff of system. There are not enough functional fans. + +- name: log shutdown + description: > + 'Log a shutdown event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Request shutdown of system. There are not enough functional fans. + +- name: create shutdown error + description: > + 'Create a Fan Shutdown Error log.' + class: callback + callback: elog + paths: chassis state + properties: chassis powered + error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/fan-errors.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/fan-errors.yaml new file mode 100644 index 000000000..0c14627d2 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/fan-errors.yaml @@ -0,0 +1,676 @@ +# Witherspoon fan error policy for PDM. +# +# * Create a NotPresent error if fan 0, 1, 2, or 3 is not present for more +# than 20 seconds. +# * Create a Nonfunctional error if fan 0, 1, 2, or 3 is not +# functional for any amount of time. +# +# The system must be powered on in both of these cases. +# If a water cooled system, don't create errors for fan 1. +# Note: An error is created each time the chassis powers on. +# +# * Watch for fans to become both present and functional, and then resolve +# their errors + +- name: fan0 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + +- name: fan1 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + +- name: fan2 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + +- name: fan3 + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: chassis state + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: fan present and functional + description: > + 'Monitor the present and functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis air cooled + description: > + 'The chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check power + +- name: watch fan0 presence + description: > + 'Trigger logic on fan0 presence state changes.' + class: watch + watch: property + paths: fan0 + properties: fan present + callback: check power fan0 presence + +- name: watch fan0 functional + description: > + 'Trigger logic on fan0 functional state changes.' + class: watch + watch: property + paths: fan0 + properties: fan functional + callback: check power fan0 functional + +- name: watch fan1 presence + description: > + 'Trigger logic on fan1 presence state changes.' + class: watch + watch: property + paths: fan1 + properties: fan present + callback: check power fan1 presence + +- name: watch fan1 functional + description: > + 'Trigger logic on fan1 functional state changes.' + class: watch + watch: property + paths: fan1 + properties: fan functional + callback: check power fan1 functional + +- name: watch fan2 presence + description: > + 'Trigger logic on fan2 presence state changes.' + class: watch + watch: property + paths: fan2 + properties: fan present + callback: check power fan2 presence + +- name: watch fan2 functional + description: > + 'Trigger logic on fan2 functional state changes.' + class: watch + watch: property + paths: fan2 + properties: fan functional + callback: check power fan2 functional + +- name: watch fan3 presence + description: > + 'Trigger logic on fan3 presence state changes.' + class: watch + watch: property + paths: fan3 + properties: fan present + callback: check power fan3 presence + +- name: watch fan3 functional + description: > + 'Trigger logic on fan3 functional state changes.' + class: watch + watch: property + paths: fan3 + properties: fan functional + callback: check power fan3 functional + +- name: watch fan0 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan0 + properties: fan present and functional + callback: resolve fan0 errors if present and functional + +- name: watch fan1 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan1 + properties: fan present and functional + callback: resolve fan1 errors if present and functional + +- name: watch fan2 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan2 + properties: fan present and functional + callback: resolve fan2 errors if present and functional + +- name: watch fan3 present and functional for resolving error logs + description: > + 'On fan present or functional state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: fan3 + properties: fan present and functional + callback: resolve fan3 errors if present and functional + +- name: check power + description: > + 'If the chassis has power, check all fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan0 presence + description: > + 'If the chassis has power, check presence of fan0.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan0 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan0 functional + description: > + 'If the chassis has power, check functional of fan0.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan0 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan1 presence + description: > + 'If the chassis has power, check presence of fan1.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan1 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan1 functional + description: > + 'If the chassis has power, check functional of fan1.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan1 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan2 presence + description: > + 'If the chassis has power, check presence of fan2.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan2 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan2 functional + description: > + 'If the chassis has power, check functional of fan2.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan2 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan3 presence + description: > + 'If the chassis has power, check presence of fan3.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan3 presence + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power fan3 functional + description: > + 'If the chassis has power, check functional of fan3.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fan3 functional + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify each of the 3 fans are present.' + class: callback + callback: group + members: + - check fan0 presence + - check fan1 presence + - check fan2 presence + - check fan3 presence + - check fan0 functional + - check fan1 functional + - check fan2 functional + - check fan3 functional + +- name: check fan0 presence + description: > + 'If this condition passes fan0 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan0 + properties: fan present + defer: 20000000us + callback: notpresent fan0 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan0 functional + description: > + 'If this condition passes fan0 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan0 + properties: fan functional + callback: nonfunctional fan0 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan1 presence + description: > + 'If this condition passes fan1 has been unplugged for more than 20 seconds. + Fan 1 is not in a water cooled Witherspoon, so check for cooling type + before creating an error.' + class: condition + condition: count + paths: fan1 + properties: fan present + defer: 20000000us + callback: check cooling type notpresent error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan1 functional + description: > + 'If this condition passes fan1 has been marked as nonfunctional. + Fan 1 is not in a water cooled Witherspoon, so check for cooling type + before creating an error.' + class: condition + condition: count + paths: fan1 + properties: fan functional + callback: check cooling type nonfunctional error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan2 presence + description: > + 'If this condition passes fan2 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan2 + properties: fan present + defer: 20000000us + callback: notpresent fan2 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan2 functional + description: > + 'If this condition passes fan2 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan2 + properties: fan functional + callback: nonfunctional fan2 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check fan3 presence + description: > + 'If this condition passes fan3 has been unplugged for more than 20 seconds.' + class: condition + condition: count + paths: fan3 + properties: fan present + defer: 20000000us + callback: notpresent fan3 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check fan3 functional + description: > + 'If this condition passes fan3 has been marked as nonfunctional.' + class: condition + condition: count + paths: fan3 + properties: fan functional + callback: nonfunctional fan3 error + countop: '>' + countbound: 0 + op: '==' + bound: false + +- name: check cooling type nonfunctional error + description: > + 'If this condition passes the chassis is air cooled and will create a + nonfunctional error for fan 1.' + class: condition + condition: count + paths: chassis + properties: chassis air cooled + callback: nonfunctional fan1 error + countop: '==' + countbound: 0 + op: '==' + bound: true + +- name: check cooling type notpresent error + description: > + 'If this condition passes the chassis is air cooled and will create a + notpresent error for fan 1.' + class: condition + condition: count + paths: chassis + properties: chassis air cooled + callback: notpresent fan1 error + countop: '==' + countbound: 0 + op: '==' + bound: true + +- name: notpresent fan0 error + class: callback + callback: elog + paths: fan0 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + type: string + +- name: nonfunctional fan0 error + class: callback + callback: elog + paths: fan0 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + type: string + +- name: notpresent fan1 error + class: callback + callback: elog + paths: fan1 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + type: string + +- name: nonfunctional fan1 error + class: callback + callback: elog + paths: fan1 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + type: string + +- name: notpresent fan2 error + class: callback + callback: elog + paths: fan2 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + type: string + +- name: nonfunctional fan2 error + class: callback + callback: elog + paths: fan2 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + type: string + +- name: notpresent fan3 error + class: callback + callback: elog + paths: fan3 + properties: fan present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + type: string + +- name: nonfunctional fan3 error + class: callback + callback: elog + paths: fan3 + properties: fan functional + error: xyz::openbmc_project::Inventory::Error::Nonfunctional + metadata: + - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + type: string + +- name: resolve fan0 errors if present and functional + description: > + 'If fan0 is present and functional, call the resolve fan0 errors callback.' + class: condition + condition: count + paths: fan0 + properties: fan present and functional + callback: resolve fan0 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +#Go ahead and do this on water cooled as well +- name: resolve fan1 errors if present and functional + description: > + 'If fan1 is present and functional, call the resolve fan1 errors callback.' + class: condition + condition: count + paths: fan1 + properties: fan present and functional + callback: resolve fan1 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan2 errors if present and functional + description: > + 'If fan2 is present and functional, call the resolve fan2 errors callback.' + class: condition + condition: count + paths: fan2 + properties: fan present and functional + callback: resolve fan2 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan3 errors if present and functional + description: > + 'If fan3 is present and functional, call the resolve fan3 errors callback.' + class: condition + condition: count + paths: fan3 + properties: fan present and functional + callback: resolve fan3 errors + countop: '==' + countbound: 2 + op: '==' + bound: true + +- name: resolve fan0 errors + class: callback + callback: resolve callout + paths: fan0 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + +- name: resolve fan1 errors + class: callback + callback: resolve callout + paths: fan1 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 + +- name: resolve fan2 errors + class: callback + callback: resolve callout + paths: fan2 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + +- name: resolve fan3 errors + class: callback + callback: resolve callout + paths: fan3 + properties: fan present and functional + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 diff --git a/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/water-cooled.yaml b/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/water-cooled.yaml new file mode 100644 index 000000000..a279cfefa --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/fan-policy/witherspoon/water-cooled.yaml @@ -0,0 +1,322 @@ +# Water cooled Witherspoon fan policy for PDM. +# +# A water cooled Witherspoon requires a minimum of two functional fan +# enclosures or four functional fan rotors across all enclosures. +# If the number of functional fan enclosures is below two, soft poweroff +# the system, whereas if the number of fan rotors drop below four, an +# immediate hard poweroff of the system occurs. + +- name: fan enclosures + description: > + 'A water cooled Witherspoon has three fan enclosures to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 + +- name: fan rotors + description: > + 'A water cooled Witherspoon has six fan rotors to monitor.' + class: group + group: path + members: + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_1 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_0 + - meta: FAN + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_1 + +- name: chassis state + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: chassis + description: > + 'Witherspoon has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSIS + path: /xyz/openbmc_project/inventory/system/chassis + +- name: fan present + description: > + 'Monitor the presence state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: fan functional + description: > + 'Monitor the functional state of each fan.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.State.Decorator.OperationalStatus + meta: FUNCTIONAL + property: Functional + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: chassis water cooled + description: > + 'Monitor the chassis cooling type.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType + meta: COOLING_TYPE + property: WaterCooled + +- name: watch fan present + description: > + 'Trigger logic on fan enclosure presence state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan present + callback: check cooling type + +- name: watch fan functional + description: > + 'Trigger logic on fan enclosure functional state changes.' + class: watch + watch: property + paths: fan enclosures + properties: fan functional + callback: check cooling type + +- name: watch fan rotor functional + description: > + 'Trigger logic on fan rotor functional state changes.' + class: watch + watch: property + paths: fan rotors + properties: fan functional + callback: check cooling type + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check cooling type + +- name: watch cooling type + description: > + 'Maintain a cache of the chassis cooling type.' + class: watch + watch: property + paths: chassis + properties: chassis water cooled + +- name: check cooling type + description: > + 'If this condition passes the chassis is water cooled.' + class: condition + condition: count + paths: chassis + properties: chassis water cooled + callback: check power + countop: '==' + countbound: 1 + op: '==' + bound: true + +- name: check power + description: > + 'If the chassis has power, check fans.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check fans + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check fans + description: > + 'Verify there are at least two functional fan enclosures and at least + four functional fan rotors, power off if not.' + class: callback + callback: group + members: + - check group presence + - check group functional enclosures + - check group functional rotors + +- name: check group presence + description: > + 'If this condition passes more than one fan has been unplugged + for more than 25 seconds. Shut the system down. Count present + fans rather than non-present fans since the latter would pass + if the fan has not been created for some reason. + + For a more detailed definition of unplugged, consult the documentation + of xyz.openbmc_project.Inventory.Item and/or the documentation + of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan present + defer: 25000000us + callback: log and shutdown + countop: '<' + countbound: 2 + op: '==' + bound: true + +- name: check group functional enclosures + description: > + 'If this condition passes more than one fan enclosure in the group has been + marked as nonfunctional for five seconds. Shut the system down. + + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan enclosures + properties: fan functional + defer: 5000000us + callback: log and shutdown + countop: '>' + countbound: 1 + op: '==' + bound: false + +- name: check group functional rotors + description: > + 'If this condition passes more than two fan rotors in the group have been + marked as nonfunctional for five seconds. Immediately power off. + + For a more detailed definition of nonfunctional, consult the documentation + of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the + documentation of the fan inventory object implementation.' + class: condition + condition: count + paths: fan rotors + properties: fan functional + defer: 5000000us + callback: log and poweroff + countop: '>' + countbound: 2 + op: '==' + bound: false + +- name: log and poweroff + description: > + 'Immediately poweroff, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - hard poweroff + - log hard poweroff + - create shutdown error + +- name: log and shutdown + description: > + 'Shut the system down, log an event in the journal, and create an + error log.' + class: callback + callback: group + members: + - shutdown + - log shutdown + - create shutdown error + +- name: hard poweroff + description: > + 'Immediately power off the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-chassis-hard-poweroff@0.target + type: string + - value: replace + type: string + +- name: shutdown + description: > + 'Shut down the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-host-shutdown@0.target + type: string + - value: replace + type: string + +- name: log hard poweroff + description: > + 'Log a hard poweroff event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Immediate poweroff of system. There are not enough functional fans. + +- name: log shutdown + description: > + 'Log a shutdown event to the systemd journal.' + class: callback + callback: journal + paths: chassis state + properties: chassis powered + severity: ERR + message: Request shutdown of system. There are not enough functional fans. + +- name: create shutdown error + description: > + 'Create a Fan Shutdown Error log.' + class: callback + callback: elog + paths: chassis state + properties: chassis powered + error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan diff --git a/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-interfaces_%.bbappend b/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-interfaces_%.bbappend new file mode 100644 index 000000000..bfc789788 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-interfaces_%.bbappend @@ -0,0 +1 @@ +EXTRA_OECONF_append_rainier = " --enable-ibm-dbus-interfaces" diff --git a/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend b/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend new file mode 100644 index 000000000..3a18960ea --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend @@ -0,0 +1,8 @@ +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_ibm-ac-server = " fan-policy" +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_ibm-ac-server = " thermal-policy" +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_ibm-ac-server = " power-supply-policy" +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_ibm-ac-server = " events-policy" +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " fan-policy" +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " thermal-policy" +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " power-supply-policy" +PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " events-policy" diff --git a/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-monitor_%.bbappend b/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-monitor_%.bbappend new file mode 100644 index 000000000..5c9d0b15c --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/phosphor-dbus-monitor_%.bbappend @@ -0,0 +1,2 @@ +SYSTEMD_LINK_phosphor-msl-verify_append_ibm-ac-server = " ../phosphor-msl-verify.service:obmc-chassis-poweron@0.target.requires/phosphor-msl-verify.service" +SYSTEMD_LINK_phosphor-msl-verify_append_mihawk = " ../phosphor-msl-verify.service:obmc-chassis-poweron@0.target.requires/phosphor-msl-verify.service" diff --git a/meta-ibm/recipes-phosphor/dbus/power-supply-policy.bb b/meta-ibm/recipes-phosphor/dbus/power-supply-policy.bb new file mode 100644 index 000000000..8d3df4600 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/power-supply-policy.bb @@ -0,0 +1,17 @@ +SUMMARY = "Power supply policy configuration for meta-witherspoon machines" +PR = "r1" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit allarch +inherit phosphor-dbus-monitor + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" + +SRC_URI += "file://power-supply-policy.yaml" + +do_install() { + install -D ${WORKDIR}/power-supply-policy.yaml ${D}${config_dir}/power-supply-policy.yaml +} + +FILES_${PN} += "${config_dir}/power-supply-policy.yaml" diff --git a/meta-ibm/recipes-phosphor/dbus/power-supply-policy/power-supply-policy.yaml b/meta-ibm/recipes-phosphor/dbus/power-supply-policy/power-supply-policy.yaml new file mode 100644 index 000000000..e00e747b6 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/power-supply-policy/power-supply-policy.yaml @@ -0,0 +1,215 @@ +# Machine power supply policy for PDM. +# +# Create an error if a power supply is removed while the system is powered on + +- name: power supply0 + class: group + group: path + members: + - meta: POWER SUPPLY + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0 + +- name: power supply1 + class: group + group: path + members: + - meta: POWER SUPPLY + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1 + +- name: power supplies + description: > + 'The machine has two power supplies to monitor.' + class: group + group: path + members: + - meta: POWER SUPPLY + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0 + - meta: POWER SUPPLY + path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1 + +- name: chassis state + description: > + 'The machine has a single chassis to monitor.' + class: group + group: path + members: + - meta: CHASSISSTATE + path: /xyz/openbmc_project/state/chassis0 + +- name: power supply present + description: > + 'Monitor the presence state of each power supply.' + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.Inventory.Item + meta: PRESENT + property: Present + +- name: chassis powered + description: > + 'Monitor the chassis power state.' + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.State.Chassis + meta: CHASSIS_STATE + property: CurrentPowerState + +- name: watch power supply present + description: > + 'Trigger logic on power supply presence state changes.' + class: watch + watch: property + paths: power supplies + properties: power supply present + callback: check power + +- name: watch chassis state + description: > + 'Trigger logic on chassis power state changes.' + class: watch + watch: property + paths: chassis state + properties: chassis powered + callback: check power + +- name: check power + description: > + 'If the chassis has power, check for power supplies.' + class: condition + condition: count + paths: chassis state + properties: chassis powered + callback: check power supplies + countop: '>' + countbound: 0 + op: '==' + bound: xyz.openbmc_project.State.Chassis.PowerState.On + +- name: check power supplies + description: > + 'Create an error if a power supply is not present.' + class: callback + callback: group + members: + - check power supply0 presence + - check power supply1 presence + +- name: check power supply0 presence + description: > + 'If this condition passes power supply0 has been unplugged for more than + 5 seconds. Count present power supplies rather than non-present + power supplies since the latter would pass if the power supply has not + been created for some reason. + + For a more detailed definition of unplugged, consult the documentation + of xyz.openbmc_project.Inventory.Item and/or the documentation + of the power supply inventory object implementation.' + class: condition + condition: count + paths: power supply0 + properties: power supply present + defer: 5000000us + callback: notpresent power supply0 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: check power supply1 presence + description: > + 'If this condition passes power supply1 has been unplugged for more than + 5 seconds.' + class: condition + condition: count + paths: power supply1 + properties: power supply present + defer: 5000000us + callback: notpresent power supply1 error + countop: '<' + countbound: 1 + op: '==' + bound: true + +- name: notpresent power supply0 error + class: callback + callback: elog + paths: power supply0 + properties: power supply present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0 + type: string + +- name: notpresent power supply1 error + class: callback + callback: elog + paths: power supply1 + properties: power supply present + error: xyz::openbmc_project::Inventory::Error::NotPresent + metadata: + - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH + value: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1 + type: string + +- name: resolve power supply0 errors if present + description: > + 'If power supply0 is present, call the resolve ps0 errors callback.' + class: condition + condition: count + paths: power supply0 + properties: power supply present + callback: resolve power supply0 errors + countop: '>' + countbound: 0 + op: '==' + bound: true + +- name: resolve power supply1 errors if present + description: > + 'If power supply1 is present, call the resolve ps1 errors callback.' + class: condition + condition: count + paths: power supply1 + properties: power supply present + callback: resolve power supply1 errors + countop: '>' + countbound: 0 + op: '==' + bound: true + +- name: resolve power supply0 errors + class: callback + callback: resolve callout + paths: power supply0 + properties: power supply present + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0 + +- name: resolve power supply1 errors + class: callback + callback: resolve callout + paths: power supply1 + properties: power supply present + callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1 + +- name: watch power supply0 present for resolving error logs + description: > + 'On supply present state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: power supply0 + properties: power supply present + callback: resolve power supply0 errors if present + +- name: watch power supply1 present for resolving error logs + description: > + 'On supply present state changes, check if errors need to be resolved.' + class: watch + watch: property + paths: power supply1 + properties: power supply present + callback: resolve power supply1 errors if present diff --git a/meta-ibm/recipes-phosphor/dbus/thermal-policy.bb b/meta-ibm/recipes-phosphor/dbus/thermal-policy.bb new file mode 100644 index 000000000..b5b38baa3 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/thermal-policy.bb @@ -0,0 +1,17 @@ +SUMMARY = "Thermal policy configuration for meta-witherspoon machines" +PR = "r1" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit allarch +inherit phosphor-dbus-monitor + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" + +SRC_URI = "file://thermal-policy.yaml" + +do_install() { + install -D ${WORKDIR}/thermal-policy.yaml ${D}${config_dir}/thermal-policy.yaml +} + +FILES_${PN} += "${config_dir}/thermal-policy.yaml" diff --git a/meta-ibm/recipes-phosphor/dbus/thermal-policy/ibm-ac-server/thermal-policy.yaml b/meta-ibm/recipes-phosphor/dbus/thermal-policy/ibm-ac-server/thermal-policy.yaml new file mode 100644 index 000000000..7c48509c5 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/thermal-policy/ibm-ac-server/thermal-policy.yaml @@ -0,0 +1,187 @@ +# Machine thermal policy for PDM. +# +# Shut down the system if more than three cores +# have a temperature greater than 115 degrees Celcius. + + +- name: core sensors + description: > + 'The machine has two processor chips with 24 cores each.' + class: group + group: path + members: + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core0_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core1_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core2_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core3_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core4_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core5_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core6_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core7_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core8_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core9_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core10_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core11_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core12_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core13_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core14_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core15_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core16_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core17_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core18_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core19_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core20_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core21_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core22_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core23_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core0_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core1_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core2_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core3_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core4_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core5_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core6_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core7_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core8_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core9_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core10_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core11_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core12_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core13_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core14_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core15_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core16_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core17_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core18_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core19_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core20_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core21_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core22_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core23_temp + +- name: core temp + description: > + 'Monitor the temperature of each core.' + class: group + group: property + type: int64 + members: + - interface: xyz.openbmc_project.Sensor.Value + meta: TEMP + property: Value + +- name: watch core temps + description: > + 'Trigger logic on core temp changes.' + class: watch + watch: property + paths: core sensors + properties: core temp + callback: check temps + +- name: check temps + description: > + 'If this condition passes at least three cores are running + too hot. Shut the system down.' + class: condition + condition: count + paths: core sensors + properties: core temp + callback: log and shutdown + countop: '>=' + countbound: 3 + op: '>=' + bound: 115000 + oneshot: true + +- name: log and shutdown + description: > + 'Shut the system down and log an event.' + class: callback + callback: group + members: + - shutdown + - create criticalhigh error + - create shutdown error + +- name: shutdown + description: > + 'Shut down the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-chassis-hard-poweroff@0.target + type: string + - value: replace + type: string + +- name: create criticalhigh error + description: > + 'Create a CriticalHigh Error log.' + class: callback + callback: elog_with_metadata + paths: core sensors + properties: core temp + error: xyz::openbmc_project::Sensor::Threshold::Error::CriticalHigh + metadata: xyz::openbmc_project::Sensor::Threshold::CriticalHigh::SENSOR_DATA + +- name: create shutdown error + description: > + 'Create a SystemShutdown Error log.' + class: callback + callback: elog + paths: core sensors + properties: core temp + error: xyz::openbmc_project::State::Shutdown::ThermalEvent::Error::Processor diff --git a/meta-ibm/recipes-phosphor/dbus/thermal-policy/mihawk/thermal-policy.yaml b/meta-ibm/recipes-phosphor/dbus/thermal-policy/mihawk/thermal-policy.yaml new file mode 100644 index 000000000..727630cb8 --- /dev/null +++ b/meta-ibm/recipes-phosphor/dbus/thermal-policy/mihawk/thermal-policy.yaml @@ -0,0 +1,345 @@ +# Mihawk thermal policy for PDM. +# +# Shut down the system if more than three cores +# have a temperature greater than 95 degrees Celcius. +# or ambient temperature greater than 45 degrees Celcius. + +- name: core sensors + description: > + 'The machine has two processor chips with 24 cores each.' + class: group + group: path + members: + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core0_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core1_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core2_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core3_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core4_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core5_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core6_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core7_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core8_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core9_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core10_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core11_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core12_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core13_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core14_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core15_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core16_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core17_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core18_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core19_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core20_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core21_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core22_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p0_core23_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core0_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core1_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core2_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core3_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core4_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core5_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core6_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core7_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core8_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core9_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core10_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core11_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core12_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core13_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core14_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core15_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core16_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core17_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core18_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core19_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core20_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core21_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core22_temp + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/p1_core23_temp + +- name: ambient sensor + description: > + 'The machine has one ambient temperature sensors.' + class: group + group: path + members: + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/ambient_temp + +- name: gpu sensors + description: > + 'Each gpu has its own temperature sensor.' + class: group + group: path + members: + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu0 + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu1 + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu2 + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu3 + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu4 + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu5 + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu6 + - meta: SENSOR + path: /xyz/openbmc_project/sensors/temperature/gpu7 + +- name: core temp + description: > + 'Monitor the temperature of each core.' + class: group + group: property + type: int64 + members: + - interface: xyz.openbmc_project.Sensor.Value + meta: TEMP + property: Value + +- name: ambient temp + description: > + 'Monitor the ambient temperature.' + class: group + group: property + type: int64 + members: + - interface: xyz.openbmc_project.Sensor.Value + meta: TEMP + property: Value + +- name: gpu temp + description: > + 'Monitor the temperature of each gpu core.' + class: group + group: property + type: int64 + members: + - interface: xyz.openbmc_project.Sensor.Value + meta: TEMP + property: Value + +- name: watch core temps + description: > + 'Trigger logic on core temp changes.' + class: watch + watch: property + paths: core sensors + properties: core temp + callback: check temps + +- name: watch ambient temp + description: > + 'Trigger logic on ambient temp changes.' + class: watch + watch: property + paths: ambient sensor + properties: ambient temp + callback: check ambient temp + +- name: watch gpu temps + description: > + 'Trigger logic on gpu core temp changes.' + class: watch + watch: property + paths: gpu sensors + properties: gpu temp + callback: check gpu temps + +- name: check temps + description: > + 'If this condition passes at least three cores are running + too hot. Shut the system down.' + class: condition + condition: count + paths: core sensors + properties: core temp + callback: log and shutdown + countop: '>=' + countbound: 3 + op: '>=' + bound: 95000 + oneshot: true + +- name: check ambient temp + description: > + 'If the ambient sensor is too hot. Shut the system down.' + class: condition + condition: count + paths: ambient sensor + properties: ambient temp + callback: ambient log and shutdown + countop: '>=' + countbound: 1 + op: '>=' + bound: 45000 + oneshot: true + +- name: check gpu temps + description: > + 'If the gpu temperature sensor is too hot. Shut the system down.' + class: condition + condition: count + paths: gpu sensors + properties: gpu temp + callback: gpu log and shutdown + countop: '>=' + countbound: 1 + op: '>=' + bound: 92 + oneshot: true + +- name: log and shutdown + description: > + 'Shut the system down and log an event.' + class: callback + callback: group + members: + - shutdown + - create criticalhigh error + - create shutdown error + +- name: ambient log and shutdown + description: > + 'Shut the system down and log an event.' + class: callback + callback: group + members: + - shutdown + - create ambient criticalhigh error + - create ambient shutdown error + +- name: gpu log and shutdown + description: > + 'Shut the system down and log an event.' + class: callback + callback: group + members: + - shutdown + - create gpu criticalhigh error + - create gpu shutdown error + +- name: shutdown + description: > + 'Shut down the system.' + class: callback + callback: method + service: org.freedesktop.systemd1 + path: /org/freedesktop/systemd1 + interface: org.freedesktop.systemd1.Manager + method: StartUnit + args: + - value: obmc-chassis-hard-poweroff@0.target + type: string + - value: replace + type: string + +- name: create criticalhigh error + description: > + 'Create a CriticalHigh Error log.' + class: callback + callback: elog_with_metadata + paths: core sensors + properties: core temp + error: xyz::openbmc_project::Sensor::Threshold::Error::CriticalHigh + metadata: xyz::openbmc_project::Sensor::Threshold::CriticalHigh::SENSOR_DATA + +- name: create ambient criticalhigh error + description: > + 'Create a Ambient CriticalHigh Error log.' + class: callback + callback: elog_with_metadata + paths: ambient sensor + properties: ambient temp + error: xyz::openbmc_project::Sensor::Threshold::Error::CriticalHigh + metadata: xyz::openbmc_project::Sensor::Threshold::CriticalHigh::SENSOR_DATA + +- name: create gpu criticalhigh error + description: > + 'Create a GPU CriticalHigh Error log.' + class: callback + callback: elog_with_metadata + paths: gpu sensors + properties: gpu temp + error: xyz::openbmc_project::Sensor::Threshold::Error::CriticalHigh + metadata: xyz::openbmc_project::Sensor::Threshold::CriticalHigh::SENSOR_DATA + +- name: create shutdown error + description: > + 'Create a SystemShutdown Error log.' + class: callback + callback: elog + paths: core sensors + properties: core temp + error: xyz::openbmc_project::State::Shutdown::ThermalEvent::Error::Processor + +- name: create ambient shutdown error + description: > + 'Create a SystemShutdown Error log.' + class: callback + callback: elog + paths: ambient sensor + properties: ambient temp + error: xyz::openbmc_project::State::Shutdown::ThermalEvent::Error::Ambient + +- name: create gpu shutdown error + description: > + 'Create a SystemShutdown Error log.' + class: callback + callback: elog + paths: gpu sensors + properties: gpu temp + error: xyz::openbmc_project::State::Shutdown::ThermalEvent::Error::GPU |