2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#!/usr/bin/perl -w
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# CDDL HEADER START
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# The contents of this file are subject to the terms of the
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# Common Development and Distribution License (the "License").
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# You may not use this file except in compliance with the License.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# or http://www.opensolaris.org/os/licensing.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# See the License for the specific language governing permissions
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# and limitations under the License.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# When distributing Covered Code, include this CDDL HEADER in each
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# If applicable, add the following below this CDDL HEADER, with the
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# fields enclosed by brackets "[]" replaced with your own identifying
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# information: Portions Copyright [yyyy] [name of copyright owner]
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# CDDL HEADER END
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# Use is subject to license terms.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# The fan topologies can be quite complicated, but are ultimately regular. This
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# perl file uses some simplified internal structures to generate an .xml file
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# without the maintenance overhead.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robjuse Getopt::Std;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robjuse strict;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# Master table of platforms.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robjmy @platforms = (
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # Galaxy 1/2 platforms.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # These systems have 2 fan-connector boards. Each fan-connector board has 3
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # fan modules. Each fan module is an individual FRU. The fan-connector
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # boards are also FRUs.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj {
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj set => "Sun-Fire-X4100-Server|Sun-Fire-X4200-Server|" .
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj "Sun-Fire-X4100-M2|Sun-Fire-X4200-M2",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj topology => [
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj {
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj label => "FT %d",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj count => 2,
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj fru => "self"
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }, {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj fac_enum => 1,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj provider => "fac_prov_ipmi",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj count => 3,
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj label => "FT %d FM %d",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj entity_ref => "ft%d.fm%d.led",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj entity_ref_nparams => 2,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj fm_service_indctr => "ft%d.fm%d.led",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj fru => "self"
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj ]
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj },
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # Thumper platforms
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # These systems have 5 fan modules, with each fan module containing 2 fans.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # The FRUs for the individual fans are the containing fan module.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj {
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj set => "Sun-Fire-X4500|Sun-Fire-X4540",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj topology => [
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj fac_enum => 0,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj provider => "fac_prov_ipmi",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj label => "FT %d",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj count => 5,
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj fru => "self",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston entity_ref => "FT%d/PRSNT,ft%d.prsnt",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj entity_ref_nparams => 1,
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston fm_service_indctr => "FT%d/SVC,ft%d.service.led",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston fm_ok2rm_indctr => "FT%d/OK,ft%d.ok2rm.led",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }, {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj fac_enum => 1,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj provider => "fac_prov_ipmi",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj count => 2,
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston entity_ref => "FT%d/FAN%d/TACH,ft%d.f%d.speed",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj entity_ref_nparams => 2,
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj fru => "parent"
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj ]
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj },
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # Fan Module/Fan topology for all G1N/G2N platforms.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # There are two fan boards, which are FRU's. Each fan board has
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # 3 fan modules for a total of 6 fan modules, with each fan module
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # containing 2 fans. The FRU's for the individual fans are the
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # containing fan module.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # Unfortunately, the IPMI topology on these systems is rather broken, and
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # all the SDRs that should be separate entities in fact refer to the same
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # entity IDs. So we have to use the alternative 'entity_present' option
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # using a single SDR record.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj {
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj set => "Sun-Fire-X4240|Sun-Fire-X4440",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj topology => [
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj {
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj count => 2,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj label => "FANBD%d",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj fru => "self"
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }, {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj label => "FANBD%d FM%d",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj count => 3,
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj fru => "self",
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston provider => "fac_prov_ipmi",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston entity_present => "FB%d/FM%d/PRSNT,fb%d.fm%d.prsnt",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston fm_service_indctr=> "FB%d/FM%d/SERVICE,fb%d.fm%d.led",
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston entity_ref_nparams => 2
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }, {
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston fac_enum => 1,
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj count => 2,
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston fru => "parent",
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston provider => "fac_prov_ipmi",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston entity_ref => "FB%d/FM%d/F%d/TACH,fb%d.fm%d.f%d.speed",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston entity_present => "FB%d/FM%d/PRSNT,fb%d.fm%d.prsnt",
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston entity_ref_nparams => 3
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj ]
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj },
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj #
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston # Fan Module/Fan topology for the Sun Fire X4600/X4600 M2 platforms.
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj #
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # These systems have 4 fan assemblies with a single fan per assembly.
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # Each fan assembly is a FRU. The fan assemblies have a service LED
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # but no other indicators.
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj #
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj {
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston set => "Sun-Fire-X4600|Sun-Fire-X4600-M2",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj topology => [
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj fac_enum => 1,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj provider => "fac_prov_ipmi",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj count => 4,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj label => "FT %d",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj fru => "self",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj entity_ref => "ft%d.fm0.prsnt",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj entity_ref_nparams => 1,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj fm_service_indctr => "ft%d.fm0.led"
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ]
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston },
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston #
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston # Fan Module/Fan topology for Sun Fire X4140.
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston #
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston # There are two fan boards, which are FRU's. The first fanboard has 4
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston # fanmodules (which are also FRU's). The second fan board has 3 fan
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston # modules. Each fanmodule contains two fans.
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston #
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston {
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston set => "Sun-Fire-X4140",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston topology => [
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston {
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston count => 2,
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston label => "FANBD%d",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston fru => "self",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston }, {
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston fac_enum => 1,
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston provider => "fac_prov_ipmi",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston label => "FANBD%d FM%d",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston count => 4,
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston fru => "self",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston fm_service_indctr=> "FB%d/FM%d/SERVICE,fb%d.fm%d.led",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston entity_ref_nparams => 2
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston }, {
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston fac_enum => 1,
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston provider => "fac_prov_ipmi",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston count => 2,
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston fru => "parent",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston entity_ref => "FB%d/FM%d/F%d/TACH,fb%d.fm%d.f%d.speed",
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston entity_ref_nparams => 3
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston }
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston ]
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston },
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston # Fan Module/Fan topology for the Sun Fire X4150.
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston # There are two fan boards, which are FRU's. The first fanboard has 4
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston # fanmodules (which are also FRU's). The second fan board has 3 fan
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston # modules. Each fanmodule contains two fans.
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston set => "SUN-FIRE-X4150",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston topology => [
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston count => 2,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston label => "FANBD%d",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fru => "self",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_present => "FB%d/PRSRNT"
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston }, {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston label => "FANBD%d FM%d",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston count => 4,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fru => "self",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston provider => "fac_prov_ipmi",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref => "FB%d/FM%d/PRSNT",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fm_service_indctr=> "",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref_nparams => 2
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston }, {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fac_enum => 1,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston count => 2,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fru => "parent",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston provider => "fac_prov_ipmi",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref => "FB%d/FM%d/F%d/TACH",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref_nparams => 3
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston }
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston ]
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston },
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston # Fan Module/Fan topology for Duradi 2U.
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston # There are two fan boards, which are FRU's. Both fanboards have 3
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston # fanmodules (which are also FRU's). Each fanmodule contains two fans.
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston set => "SUN-FIRE-X4250|SUN-FIRE-X4450",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston topology => [
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston count => 2,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston label => "FANBD%d",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fru => "self",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_present => "FB%d/PRSRNT"
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston }, {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston label => "FANBD%d FM%d",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston count => 3,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fru => "self",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston provider => "fac_prov_ipmi",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref => "FB%d/FM%d/PRSNT",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fm_service_indctr=> "",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref_nparams => 2
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston }, {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fac_enum => 1,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston count => 2,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston fru => "parent",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston provider => "fac_prov_ipmi",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref => "FB%d/FM%d/F%d/TACH",
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston entity_ref_nparams => 3
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston }
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston ]
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj);
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# Process an entry in the topology list. We are passed the indentation level,
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston# the current topology array, the set list, and any pushed indices. This is
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston# called recursively.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robjsub process_topology
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj{
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston my ($indent, $toporef, $set, @indices) = @_;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj my @topo = @$toporef;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj my $level = shift @topo;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj my $type = $#topo == -1 ? "fan" : "fanmodule";
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<range name='%s' min='%d' max='%d'>\n",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent, "", $type, 0, $level->{count} - 1);
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent += 2;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj for (my $i = 0; $i < $level->{count}; $i++) {
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston # Special case code for the 1U version of Durado and Duradi,
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston # both of which have an assymetric fan topology
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston #
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston last if ((($set eq "SUN-FIRE-X4150") || ($set eq "Sun-Fire-X4140"))
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston && ($type eq "fanmodule") && ($#indices == 0)
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston && ($indices[0] == 1) && ($i == 3));
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj push @indices, $i;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<node instance='%d'>\n", $indent, "", $i);
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent += 2;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # Facility enumerator
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if ($level->{fac_enum}) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<fac-enum provider='",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $indent, "");
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston printf($level->{provider});
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("' />\n");
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # Facility nodes for service and ok2rm LED's
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if ($level->{fm_service_indctr}) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<facility name='service' type='indicator' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "provider='fac_prov_ipmi' >\n", $indent+2, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propgroup name='facility' version='1' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "name-stability='Private' data-stability='Private' >\n",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $indent+4, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propval name='type' type='uint32' ".
80f1b0f5d7bc2c2f91ce68ea6379c779a03c595eRobert Johnston "value='0' />\n", $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propmethod name='ipmi_entity' version='0' ".
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston "propname='entity_ref' proptype='string_array' >\n",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $indent+6, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s<argval name='format' type='string_array'>\n",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston $indent+8, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston my @refs = split(/\,/, $level->{fm_service_indctr});
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston foreach my $ref (@refs) {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s<argitem value='", $indent+10, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf($ref, @indices);
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("' />\n");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s</argval>\n", $indent+8, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<argval name='offset' type='uint32' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "value='0' />\n", $indent+8, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<argval name='nparams' type='uint32' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "value='%d' />\n", $indent+8, "",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $level->{entity_ref_nparams});
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propmethod>\n", $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propmethod name='ipmi_indicator_mode' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "version='0' propname='mode' proptype='uint32' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "mutable='1' >\n", $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propmethod>\n", $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propgroup>\n", $indent+4, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</facility>\n", $indent+2, "");
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if ($level->{fm_ok2rm_indctr}) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<facility name='ok2rm' type='indicator' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "provider='fac_prov_ipmi' >\n", $indent+2, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propgroup name='facility' version='1' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "name-stability='Private' data-stability='Private' >\n",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $indent+4, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propval name='type' type='uint32' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "value='2' />\n", $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propmethod name='ipmi_entity' version='0' ".
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston "propname='entity_ref' proptype='string_array' >\n",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $indent+6, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s<argval name='format' type='string_array'>\n",
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston $indent+8, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston my @refs = split(/\,/, $level->{fm_ok2rm_indctr});
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston foreach my $ref (@refs) {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s<argitem value='", $indent+10, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf($ref, @indices);
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("' />\n");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s</argval>\n", $indent+8, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<argval name='offset' type='uint32' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "value='0' />\n", $indent+8, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<argval name='nparams' type='uint32' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "value='%d' />\n", $indent+8, "",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $level->{entity_ref_nparams});
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propmethod>\n", $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propmethod name='ipmi_indicator_mode' ".
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj "version='0' propname='mode' proptype='uint32' mutable='1' >\n",
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propmethod>\n", $indent+6, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propgroup>\n", $indent+4, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</facility>\n", $indent+2, "");
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # Protocol properties (label, fmri)
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propgroup name='protocol' version='1' " .
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj "name-stability='Private' data-stability='Private'>\n",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent += 2;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj if ($level->{label}) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propval name='label' type='string' " .
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj "value='", $indent, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf($level->{label}, @indices);
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("' />\n");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propmethod name='ipmi_fru_fmri' " .
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj "version='0' propname='FRU' proptype='fmri'>\n",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<argval name='entity' type='string' " .
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj "value='%s' />\n", $indent + 2, "", $level->{fru});
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propmethod>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent -= 2;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propgroup>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # Entity references (if any)
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston if ($level->{entity_ref}) {
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston my $val = $level->{entity_ref};
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston printf("%*s<propgroup name='ipmi' version='1' " .
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston "name-stability='Private' " .
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston "data-stability='Private' >\n", $indent, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s<propval name='entity_ref' ".
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston "type='string_array'>\n", $indent + 2, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston my @refs = split(/\,/, $val);
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston foreach my $ref (@refs) {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s<propitem value='", $indent+4, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf($ref, @indices);
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("' />\n");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s</propval>\n", $indent+2, "");
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston printf("%*s</propgroup>\n", $indent, "");
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston }
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston if ($level->{entity_present}) {
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston my $val = $level->{entity_present};
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<propgroup name='ipmi' version='1' " .
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj "name-stability='Private' " .
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj "data-stability='Private' >\n", $indent, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston printf("%*s<propval name='entity_present' " .
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston "type='string_array'>\n", $indent + 2, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston my @refs = split(/\,/, $val);
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston foreach my $ref (@refs) {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s<propitem value='", $indent+4, "");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf($ref, @indices);
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("' />\n");
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston printf("%*s</propval>\n", $indent+4, "");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</propgroup>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj #
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj # Post-process IPMI enumerator method
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj #
7793aa8b1cb26c7fc1397aa9db2364098fc25543Eric Schrock printf("%*s<enum-method name='ipmi' version='1' ".
7793aa8b1cb26c7fc1397aa9db2364098fc25543Eric Schrock "/>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj # Children (if any)
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj #
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj if ($#topo != -1) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<dependents grouping='children'>\n",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent, "");
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston process_topology($indent + 2, \@topo, $set, @indices);
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</dependents>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent -= 2;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</node>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj pop @indices;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj }
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $indent -= 2;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</range>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj}
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj# Process a single platform file.
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj#
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robjsub process_platform
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj{
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj my ($desc) = @_;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj my $indent = 2;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s<set type='product' setlist='%s'>\n", $indent, "",
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj $desc->{set});
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
7fcedef2cb0c5f9b2168d8c757cf243facdec1e6Robert Johnston process_topology($indent + 2, $desc->{topology}, $desc->{set});
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrock printf("%*s</set>\n", $indent, "");
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj}
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrockprint "<topology name='fan' scheme='hc'>\n";
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robjmy $desc;
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robjforeach $desc (@platforms) {
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj process_platform($desc);
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj}
2eeaed14a5e2ed9bd811643ad5bffc3510ca0310robj
d91236fe104c7ea63142e053b22a39c8a30d304beschrockprint "</topology>\n";