| FILESEXTRAPATHS:prepend:gbmc := "${THISDIR}/${PN}:" |
| |
| SRC_URI:append:gbmc = " \ |
| file://gbmc_eth_config.json \ |
| file://gbmc_eth_access.json \ |
| " |
| |
| DEPENDS:append:gbmc = " jq-native" |
| |
| GBMCBR_IPMI_CHANNEL ?= "11" |
| GBMC_NCSI_IPMI_CHANNEL ??= "1" |
| GBMC_NCSI_IPMI_CHANNEL:npcm8xx ??= "2" |
| # Only used for extra channels, GBMCBR and NCSI are autopopulated |
| # Format looks like "<channel>|<intf> <channel2>|<intf2>", Ex. "2|eth0 3|back" |
| GBMC_IPMI_CHANNEL_MAP ??= "" |
| |
| ENTITY_MAPPING ?= "default" |
| |
| gbmc_add_channel() { |
| local chan="$1" |
| local intf="$2" |
| |
| jq --slurpfile ecfg ${WORKDIR}/gbmc_eth_config.json --arg CHAN "$chan" --arg INTF "$intf" \ |
| '. + {$CHAN: ($ecfg[0] + {"name": $INTF})}' $config_json >${WORKDIR}/tmp-config.json |
| mv ${WORKDIR}/tmp-config.json $config_json |
| |
| jq --slurpfile ecfg ${WORKDIR}/gbmc_eth_access.json --arg CHAN "$chan" \ |
| '. + {$CHAN: $ecfg[0]}' $access_json >${WORKDIR}/tmp-access.json |
| mv ${WORKDIR}/tmp-access.json $access_json |
| } |
| |
| # Replace a channel in config.json to add gbmcbr reporting |
| do_install:append:gbmc() { |
| config_json=${D}${datadir}/ipmi-providers/channel_config.json |
| access_json=${D}${datadir}/ipmi-providers/channel_access.json |
| |
| overlapping="$(jq '."${GBMCBR_IPMI_CHANNEL}" | .is_valid and .name != "gbmcbr"' $config_json)" |
| if [ "$overlapping" != "false" ]; then |
| echo "gBMC channel config overlaps on ${GBMCBR_IPMI_CHANNEL}" >&2 |
| cat $config_json |
| exit 1 |
| fi |
| overlapping="$(jq '."${GBMCBR_IPMI_CHANNEL}" | .access_mode and .access_mode != "always_available"' $access_json)" |
| if [ "$overlapping" != "false" ]; then |
| echo "gBMC channel access overlaps on ${GBMCBR_IPMI_CHANNEL}" >&2 |
| cat $access_json |
| exit 1 |
| fi |
| gbmc_add_channel ${GBMCBR_IPMI_CHANNEL} gbmcbr |
| if [ -n "${GBMC_NCSI_IF_NAME}" ]; then |
| gbmc_add_channel ${GBMC_NCSI_IPMI_CHANNEL} ${GBMC_NCSI_IF_NAME} |
| fi |
| map="${GBMC_IPMI_CHANNEL_MAP}" |
| # Split the map over the space separated entries |
| for entry in $map; do |
| OLDIFS="$IFS" |
| # Split the entry over the `|` separator |
| IFS='|' |
| gbmc_add_channel $entry |
| IFS="$OLDIFS" |
| done |
| |
| # Set entity-map.json to empty json for gBMC by default. |
| # Each system will override it if needed. |
| if [[ "${ENTITY_MAPPING}" != "default" ]]; then |
| echo "[]" > ${D}${datadir}/ipmi-providers/entity-map.json |
| fi |
| } |
| |
| python do_gbmc_version () { |
| import json |
| |
| if d.getVar('GBMC_VERSION') is None: |
| return |
| |
| version = d.getVar('GBMC_VERSION').split('.') |
| major = min(int(version[0]), 0x7F) & 0x7F |
| minor = min(int(version[1]), 99) |
| minor = int(minor / 10) * 16 + minor % 10; |
| point = int(version[2]) |
| subpoint = int(version[3]) |
| |
| dir = d.getVar('D') + d.getVar('datadir') + '/ipmi-providers' |
| path = os.path.join(dir, 'dev_id.json') |
| |
| dev_id = {} |
| |
| # Open existing dev_id and override the fields not needed for version. |
| with open(path, 'r') as f: |
| dev_id = json.load(f) |
| dev_id["firmware_revision"] = { |
| "major": major, |
| "minor": minor |
| } |
| dev_id["aux"] = subpoint << 16 | (0xFFFF & point) |
| |
| with open(path, 'w') as f: |
| json.dump(dev_id, f, sort_keys=True, indent=4) |
| } |
| |
| addtask gbmc_version after do_install before do_package |