1#!/usr/bin/env python 2 3# TODO: openbmc/openbmc#2994 remove python 2 support 4try: # python 2 5 import gobject 6except ImportError: # python 3 7 from gi.repository import GObject as gobject 8import dbus 9import dbus.service 10import dbus.mainloop.glib 11import os 12from obmc.dbuslib.bindings import DbusProperties, DbusObjectManager, get_dbus 13import obmc.enums 14import obmc_system_config as System 15import obmc.inventory 16import obmc.system 17 18DBUS_NAME = 'org.openbmc.managers.System' 19OBJ_NAME = '/org/openbmc/managers/System' 20INTF_SENSOR = 'org.openbmc.SensorValue' 21 22class SystemManager(DbusProperties, DbusObjectManager): 23 def __init__(self, bus, obj_name): 24 super(SystemManager, self).__init__( 25 conn=bus, 26 object_path=obj_name) 27 self.bus = bus 28 29 # replace symbolic path in ID_LOOKUP 30 for category in System.ID_LOOKUP: 31 for key in System.ID_LOOKUP[category]: 32 val = System.ID_LOOKUP[category][key] 33 new_val = val.replace( 34 "<inventory_root>", obmc.inventory.INVENTORY_ROOT) 35 System.ID_LOOKUP[category][key] = new_val 36 37 print("SystemManager Init Done") 38 39 def doObjectLookup(self, category, key): 40 obj_path = "" 41 intf_name = INTF_SENSOR 42 try: 43 obj_path = System.ID_LOOKUP[category][key] 44 parts = obj_path.split('/') 45 if (parts[3] != 'sensors'): 46 print ("ERROR SystemManager: SENSOR only supported type") 47 intf_name = "" 48 except Exception as e: 49 print ("ERROR SystemManager: "+str(e)+" not found in lookup") 50 51 return [obj_path, intf_name] 52 53 @dbus.service.method(DBUS_NAME, in_signature='ss', out_signature='(ss)') 54 def getObjectFromId(self, category, key): 55 return self.doObjectLookup(category, key) 56 57 @dbus.service.method(DBUS_NAME, in_signature='sy', out_signature='(ss)') 58 def getObjectFromByteId(self, category, key): 59 byte = int(key) 60 return self.doObjectLookup(category, byte) 61 62 @dbus.service.method(DBUS_NAME, in_signature='s', out_signature='sis') 63 def gpioInit(self, name): 64 gpio_path = '' 65 gpio_num = -1 66 r = ['', gpio_num, ''] 67 if name not in System.GPIO_CONFIG: 68 # TODO: Better error handling 69 msg = "ERROR: "+name+" not found in GPIO config table" 70 print(msg) 71 raise Exception(msg) 72 else: 73 74 gpio_num = -1 75 gpio = System.GPIO_CONFIG[name] 76 if 'gpio_num' in System.GPIO_CONFIG[name]: 77 gpio_num = gpio['gpio_num'] 78 else: 79 if 'gpio_pin' in System.GPIO_CONFIG[name]: 80 gpio_num = obmc.system.convertGpio(gpio['gpio_pin']) 81 else: 82 msg = "ERROR: SystemManager - GPIO lookup failed for "+name 83 print(msg) 84 raise Exception(msg) 85 86 if (gpio_num != -1): 87 r = [obmc.enums.GPIO_DEV, gpio_num, gpio['direction']] 88 return r 89 90 @dbus.service.method(DBUS_NAME, in_signature='', 91 out_signature='ssa(sb)a(sb)a(sbb)ssssa(sb)') 92 def getGpioConfiguration(self): 93 power_config = System.GPIO_CONFIGS.get('power_config', {}) 94 power_good_in = power_config.get('power_good_in', '') 95 latch_out = power_config.get('latch_out', '') 96 power_up_outs = power_config.get('power_up_outs', []) 97 reset_outs = power_config.get('reset_outs', []) 98 pci_reset_outs = power_config.get('pci_reset_outs', []) 99 hostctl_config = System.GPIO_CONFIGS.get('hostctl_config', {}) 100 fsi_data = hostctl_config.get('fsi_data', '') 101 fsi_clk = hostctl_config.get('fsi_clk', '') 102 fsi_enable = hostctl_config.get('fsi_enable', '') 103 cronus_sel = hostctl_config.get('cronus_sel', '') 104 optionals = hostctl_config.get('optionals', []) 105 r = [power_good_in, latch_out, power_up_outs, reset_outs, 106 pci_reset_outs, fsi_data, fsi_clk, fsi_enable, cronus_sel, 107 optionals] 108 print("Power GPIO config: " + str(r)) 109 return r 110 111 112if __name__ == '__main__': 113 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 114 bus = get_dbus() 115 obj = SystemManager(bus, OBJ_NAME) 116 mainloop = gobject.MainLoop() 117 obj.unmask_signals() 118 name = dbus.service.BusName(DBUS_NAME, bus) 119 120 print("Running SystemManager") 121 mainloop.run() 122 123# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 124