1de6ed120SBrad Bishop#!/usr/bin/env python
240a360c2SBrad Bishop
3d65b2d50SCamVan Nguyen# TODO: openbmc/openbmc#2994 remove python 2 support
4d65b2d50SCamVan Nguyentry:  # python 2
540a360c2SBrad Bishop    import gobject
6d65b2d50SCamVan Nguyenexcept ImportError:  # python 3
7d65b2d50SCamVan Nguyen    from gi.repository import GObject as gobject
840a360c2SBrad Bishopimport dbus
940a360c2SBrad Bishopimport dbus.service
1040a360c2SBrad Bishopimport dbus.mainloop.glib
1140a360c2SBrad Bishopimport os
1240a360c2SBrad Bishopfrom obmc.dbuslib.bindings import DbusProperties, DbusObjectManager, get_dbus
1340a360c2SBrad Bishopimport obmc.enums
140b380f7bSBrad Bishopimport obmc_system_config as System
15f6e918e4SAndrew Geisslerimport obmc.inventory
16a7ac805bSBrad Bishopimport obmc.system
1740a360c2SBrad Bishop
18*75fe8cc4SPatrick WilliamsDBUS_NAME = "org.openbmc.managers.System"
19*75fe8cc4SPatrick WilliamsOBJ_NAME = "/org/openbmc/managers/System"
20*75fe8cc4SPatrick WilliamsINTF_SENSOR = "org.openbmc.SensorValue"
21*75fe8cc4SPatrick Williams
2240a360c2SBrad Bishop
2340a360c2SBrad Bishopclass SystemManager(DbusProperties, DbusObjectManager):
2440a360c2SBrad Bishop    def __init__(self, bus, obj_name):
25*75fe8cc4SPatrick Williams        super(SystemManager, self).__init__(conn=bus, object_path=obj_name)
26fa736499SBrad Bishop        self.bus = bus
2740a360c2SBrad Bishop
28f6e918e4SAndrew Geissler        # replace symbolic path in ID_LOOKUP
29f6e918e4SAndrew Geissler        for category in System.ID_LOOKUP:
30f6e918e4SAndrew Geissler            for key in System.ID_LOOKUP[category]:
31f6e918e4SAndrew Geissler                val = System.ID_LOOKUP[category][key]
32f6e918e4SAndrew Geissler                new_val = val.replace(
33*75fe8cc4SPatrick Williams                    "<inventory_root>", obmc.inventory.INVENTORY_ROOT
34*75fe8cc4SPatrick Williams                )
35f6e918e4SAndrew Geissler                System.ID_LOOKUP[category][key] = new_val
36f6e918e4SAndrew Geissler
37d65b2d50SCamVan Nguyen        print("SystemManager Init Done")
3840a360c2SBrad Bishop
39f6e918e4SAndrew Geissler    def doObjectLookup(self, category, key):
40f6e918e4SAndrew Geissler        obj_path = ""
41f6e918e4SAndrew Geissler        intf_name = INTF_SENSOR
42f6e918e4SAndrew Geissler        try:
43f6e918e4SAndrew Geissler            obj_path = System.ID_LOOKUP[category][key]
44*75fe8cc4SPatrick Williams            parts = obj_path.split("/")
45*75fe8cc4SPatrick Williams            if parts[3] != "sensors":
46f6e918e4SAndrew Geissler                print("ERROR SystemManager: SENSOR only supported type")
47f6e918e4SAndrew Geissler                intf_name = ""
48f6e918e4SAndrew Geissler        except Exception as e:
49f6e918e4SAndrew Geissler            print("ERROR SystemManager: " + str(e) + " not found in lookup")
50f6e918e4SAndrew Geissler
51f6e918e4SAndrew Geissler        return [obj_path, intf_name]
52f6e918e4SAndrew Geissler
53*75fe8cc4SPatrick Williams    @dbus.service.method(DBUS_NAME, in_signature="ss", out_signature="(ss)")
54f6e918e4SAndrew Geissler    def getObjectFromId(self, category, key):
55f6e918e4SAndrew Geissler        return self.doObjectLookup(category, key)
56f6e918e4SAndrew Geissler
57*75fe8cc4SPatrick Williams    @dbus.service.method(DBUS_NAME, in_signature="sy", out_signature="(ss)")
58f6e918e4SAndrew Geissler    def getObjectFromByteId(self, category, key):
59f6e918e4SAndrew Geissler        byte = int(key)
60f6e918e4SAndrew Geissler        return self.doObjectLookup(category, byte)
61f6e918e4SAndrew Geissler
62*75fe8cc4SPatrick Williams    @dbus.service.method(DBUS_NAME, in_signature="s", out_signature="sis")
6340a360c2SBrad Bishop    def gpioInit(self, name):
64*75fe8cc4SPatrick Williams        gpio_path = ""
6540a360c2SBrad Bishop        gpio_num = -1
66*75fe8cc4SPatrick Williams        r = ["", gpio_num, ""]
67416539dfSBrad Bishop        if name not in System.GPIO_CONFIG:
68605620d2SXo Wang            # TODO: Better error handling
69605620d2SXo Wang            msg = "ERROR: " + name + " not found in GPIO config table"
70d65b2d50SCamVan Nguyen            print(msg)
71605620d2SXo Wang            raise Exception(msg)
7240a360c2SBrad Bishop        else:
7340a360c2SBrad Bishop
7440a360c2SBrad Bishop            gpio_num = -1
7540a360c2SBrad Bishop            gpio = System.GPIO_CONFIG[name]
76*75fe8cc4SPatrick Williams            if "gpio_num" in System.GPIO_CONFIG[name]:
77*75fe8cc4SPatrick Williams                gpio_num = gpio["gpio_num"]
7840a360c2SBrad Bishop            else:
79*75fe8cc4SPatrick Williams                if "gpio_pin" in System.GPIO_CONFIG[name]:
80*75fe8cc4SPatrick Williams                    gpio_num = obmc.system.convertGpio(gpio["gpio_pin"])
8140a360c2SBrad Bishop                else:
82*75fe8cc4SPatrick Williams                    msg = (
83*75fe8cc4SPatrick Williams                        "ERROR: SystemManager - GPIO lookup failed for " + name
84*75fe8cc4SPatrick Williams                    )
85d65b2d50SCamVan Nguyen                    print(msg)
86605620d2SXo Wang                    raise Exception(msg)
8740a360c2SBrad Bishop
88*75fe8cc4SPatrick Williams            if gpio_num != -1:
89*75fe8cc4SPatrick Williams                r = [obmc.enums.GPIO_DEV, gpio_num, gpio["direction"]]
9040a360c2SBrad Bishop        return r
9140a360c2SBrad Bishop
92*75fe8cc4SPatrick Williams    @dbus.service.method(
93*75fe8cc4SPatrick Williams        DBUS_NAME, in_signature="", out_signature="ssa(sb)a(sb)a(sbb)ssssa(sb)"
94*75fe8cc4SPatrick Williams    )
9575a18a23SLei YU    def getGpioConfiguration(self):
96*75fe8cc4SPatrick Williams        power_config = System.GPIO_CONFIGS.get("power_config", {})
97*75fe8cc4SPatrick Williams        power_good_in = power_config.get("power_good_in", "")
98*75fe8cc4SPatrick Williams        latch_out = power_config.get("latch_out", "")
99*75fe8cc4SPatrick Williams        power_up_outs = power_config.get("power_up_outs", [])
100*75fe8cc4SPatrick Williams        reset_outs = power_config.get("reset_outs", [])
101*75fe8cc4SPatrick Williams        pci_reset_outs = power_config.get("pci_reset_outs", [])
102*75fe8cc4SPatrick Williams        hostctl_config = System.GPIO_CONFIGS.get("hostctl_config", {})
103*75fe8cc4SPatrick Williams        fsi_data = hostctl_config.get("fsi_data", "")
104*75fe8cc4SPatrick Williams        fsi_clk = hostctl_config.get("fsi_clk", "")
105*75fe8cc4SPatrick Williams        fsi_enable = hostctl_config.get("fsi_enable", "")
106*75fe8cc4SPatrick Williams        cronus_sel = hostctl_config.get("cronus_sel", "")
107*75fe8cc4SPatrick Williams        optionals = hostctl_config.get("optionals", [])
108*75fe8cc4SPatrick Williams        r = [
109*75fe8cc4SPatrick Williams            power_good_in,
110*75fe8cc4SPatrick Williams            latch_out,
111*75fe8cc4SPatrick Williams            power_up_outs,
112*75fe8cc4SPatrick Williams            reset_outs,
113*75fe8cc4SPatrick Williams            pci_reset_outs,
114*75fe8cc4SPatrick Williams            fsi_data,
115*75fe8cc4SPatrick Williams            fsi_clk,
116*75fe8cc4SPatrick Williams            fsi_enable,
117*75fe8cc4SPatrick Williams            cronus_sel,
118*75fe8cc4SPatrick Williams            optionals,
119*75fe8cc4SPatrick Williams        ]
120d65b2d50SCamVan Nguyen        print("Power GPIO config: " + str(r))
1213f87de8bSXo Wang        return r
1223f87de8bSXo Wang
12340a360c2SBrad Bishop
124*75fe8cc4SPatrick Williamsif __name__ == "__main__":
12540a360c2SBrad Bishop    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
12640a360c2SBrad Bishop    bus = get_dbus()
12740a360c2SBrad Bishop    obj = SystemManager(bus, OBJ_NAME)
12840a360c2SBrad Bishop    mainloop = gobject.MainLoop()
129f0f3efe1SBrad Bishop    obj.unmask_signals()
13070852a38SBrad Bishop    name = dbus.service.BusName(DBUS_NAME, bus)
13140a360c2SBrad Bishop
132d65b2d50SCamVan Nguyen    print("Running SystemManager")
13340a360c2SBrad Bishop    mainloop.run()
13453066750SBrad Bishop
13553066750SBrad Bishop# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
136