lots of changes
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index d7c596b..2d5c800 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -5,7 +5,7 @@
import Openbmc
HOME_PATH = './'
-BIN_PATH = HOME_PATH
+BIN_PATH = HOME_PATH+'bin/'
CACHE_PATH = HOME_PATH+'cache/'
FRU_PATH = CACHE_PATH+'frus/'
@@ -45,32 +45,17 @@
]
}
-SYSTEM_CONFIG['org.openbmc.managers.Frus'] = {
+SYSTEM_CONFIG['org.openbmc.managers.Inventory'] = {
'system_state' : 'STANDBY',
'start_process' : True,
'monitor_process' : True,
- 'process_name' : 'fru_manager.py',
+ 'process_name' : 'inventory_manager.py',
'heartbeat' : 'no',
'rest_name' : 'frus',
'instances' : [
{
'name' : 'Barreleye',
- 'user_label': 'Fru Manager',
- }
- ]
- }
-
-SYSTEM_CONFIG['org.openbmc.managers.Ipmi'] = {
- 'system_state' : 'STANDBY',
- 'start_process' : True,
- 'monitor_process' : True,
- 'process_name' : 'ipmi_manager.py',
- 'heartbeat' : 'no',
- 'rest_name' : 'frus',
- 'instances' : [
- {
- 'name' : 'Barreleye',
- 'user_label': 'Ipmi Manager',
+ 'user_label': 'Inventory Manager',
}
]
}
@@ -348,7 +333,6 @@
'manufacturer' : 'DELTA',
'fru' : True,
'location' : 'F0',
- 'sensor_link' : 'fans/Fan_0',
},
'/system/fan1' :
{
@@ -356,7 +340,6 @@
'manufacturer' : 'DELTA',
'fru' : True,
'location' : 'F1',
- 'sensor_link' : 'fans/Fan_1',
},
'/system/motherboard/bmc' :
{
@@ -376,27 +359,27 @@
{
'ftype' : Openbmc.FRU_TYPES['CORE'],
'fru' : False,
- 'sensor_link' : 1,
+ 'sensor_id' : 1,
},
'/system/motherboard/cpu0/core1' :
{
'ftype' : Openbmc.FRU_TYPES['CORE'],
'fru' : False,
- 'sensor_link' : 2,
+ 'sensor_id' : 2,
},
'/system/motherboard/dimm0' :
{
'ftype' : Openbmc.FRU_TYPES['DIMM'],
'fru' : True,
'fru_id' : 12,
- 'sensor_link' : 20,
+ 'sensor_id' : 20,
},
'/system/motherboard/dimm1' :
{
'ftype' : Openbmc.FRU_TYPES['DIMM'],
'fru' : True,
'fru_id' : 13,
- 'sensor_link' : 21,
+ 'sensor_id' : 21,
},
}
diff --git a/bin/fru_manager.py b/bin/fru_manager.py
deleted file mode 100644
index 220b7d3..0000000
--- a/bin/fru_manager.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import sys
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import cPickle
-import json
-
-if (len(sys.argv) < 2):
- print "Usage: fru_manager.py [system name]"
- exit(1)
-System = __import__(sys.argv[1])
-import Openbmc
-
-DBUS_NAME = 'org.openbmc.managers.Frus'
-OBJ_NAME = '/org/openbmc/managers/Frus'
-FRUS = System.FRU_INSTANCES
-
-class Fru:
- def __init__(self,fru_id,data):
- if (data.has_key('ftype') == False):
- raise Exception("Fru must have ftype")
-
- self.fru_id = fru_id
- self.data = { 'fru_id' : fru_id }
- self.ftype = data['ftype']
- self.update(data)
-
- def getField(self,field):
- return self.data[field]
-
- def getId(self):
- return self.fru_id
-
- def update(self,data):
- for k in data.keys():
- self.data[k] = data[k]
-
- def isCached(self):
- is_cached = False
- if (self.data.has_key('cache')):
- if (self.data['cache']):
- is_cached = True
- return is_cached
-
- def saveToCache(self):
- if (self.isCached() == False):
- return
- global FRU_PATH
- print "Caching: "+str(self.fru_id)
- filename = FRU_PATH+"fru_"+str(self.fru_id)
- output = open(filename, 'wb')
- ## just pickle dict not whole object
- cPickle.dump(self.data,output)
- output.close()
-
- def loadFromCache(self):
- if (self.isCached() == False):
- return;
- ## overlay with pickled data
- global FRU_PATH
- filename = FRU_PATH+"fru_"+str(self.fru_id)
-
- if (os.path.isfile(filename)):
- print "Loading from cache: "+filename
- p = open(filename, 'rb')
- data2 = cPickle.load(p)
- for k in data2.keys():
- self.data[k] = data2[k]
- def toJson(self):
- return json.dumps(self.data)
-
- def __str__(self):
- r = "Fru: "+str(self.fru_id)+"\n"
- for f in self.data.keys():
- r = r+f+" = "+str(self.data[f])+"\n"
- return r
-
-
-
-class FruManager(dbus.service.Object):
- def __init__(self,bus,name):
- dbus.service.Object.__init__(self,bus,name)
-
- bus.add_signal_receiver(self.UpdateFruHandler,
- signal_name = 'UpdateFru')
-
- self.fru_db = {}
- self.fru_id_lookup = {}
- for fru in FRUS.keys():
- #self.updateFru(fid,System.FRUS[fid])
- if (FRUS[fru].has_key('fru_id')):
- print fru
- print FRUS[fru]['fru_id']
-
- def UpdateFruHandler(self,fru_id,data):
- self.updateFru(fru_id,data)
-
- @dbus.service.method(DBUS_NAME,
- in_signature='isv', out_signature='')
- def updateFruField(self,fru_id,field,value):
- data = { field : value }
- self.updateFru(fru_id,data)
-
- @dbus.service.method(DBUS_NAME,
- in_signature='ia{sv}', out_signature='')
- def updateFru(self,fru_id,data):
- ## translate dbus data into basic data types
- for k in data.keys():
- d = Openbmc.DbusProperty(k,data[k])
- data[k] = d.getBaseValue()
-
- if (self.fru_db.has_key(fru_id)):
- ## update properties then save to cache
- print "Updating FRU: "+str(fru_id)
- self.fru_db[fru_id].update(data)
- self.fru_db[fru_id].saveToCache()
- else:
- ## fru doesn't exist, so add
- ## then overlay with data from cache
- print "Adding FRU: "+str(fru_id)
- fru = Fru(fru_id,data)
- self.fru_db[fru_id] = fru
- fru.loadFromCache()
-
-
- @dbus.service.method(DBUS_NAME,
- in_signature='', out_signature='s')
- def getFrus(self):
- r = ""
- for f in self.fru_db.keys():
- r=r+"["+self.fru_db[f].toJson()+"],"
- return r
-
-
-if __name__ == '__main__':
- dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
- bus = dbus.SessionBus()
- name = dbus.service.BusName(DBUS_NAME,bus)
- obj = FruManager(bus,OBJ_NAME)
- mainloop = gobject.MainLoop()
-
- print "Running Fru Manager"
- mainloop.run()
-
diff --git a/bin/inventory_manager.py b/bin/inventory_manager.py
new file mode 100644
index 0000000..dcc0114
--- /dev/null
+++ b/bin/inventory_manager.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import cPickle
+import json
+
+if (len(sys.argv) < 2):
+ print "Usage: inventory_manager.py [system name]"
+ exit(1)
+System = __import__(sys.argv[1])
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.managers.Inventory'
+OBJ_NAME = '/org/openbmc/managers/Inventory'
+FRUS = System.FRU_INSTANCES
+FRU_PATH = System.FRU_PATH
+
+## accessor class to FRU data structure
+class Fru:
+ def __init__(self,fru):
+ ## validation
+ if (FRUS.has_key(fru) == False):
+ # TODO: event log
+ raise Exception("Invalid FRU path: "+fru)
+
+ self.fru = fru
+
+ def getField(self,field):
+ if (FRUS[self.fru].has_key(field) == False):
+ # TODO: event log
+ raise Exception("Invalid field: "+field)
+
+ return FRUS[self.fru][field]
+
+ def isFru(self):
+ return FRUS[self.fru]['fru']
+
+ def update(self,data):
+ for k in data.keys():
+ FRUS[self.fru][k] = data[k]
+
+ def isCached(self):
+ return True
+
+ def getCacheFilename(self):
+ global FRU_PATH
+ filename = FRU_PATH+self.fru.replace('/','.')
+ return filename
+
+ def saveToCache(self):
+ if (self.isCached() == False):
+ return
+ print "Caching: "+self.fru
+ output = open(self.getCacheFilename(), 'wb')
+ ## just pickle dict not whole object
+ print FRUS[self.fru]
+ cPickle.dump(FRUS[self.fru],output)
+ output.close()
+
+ def loadFromCache(self):
+ if (self.isCached() == False):
+ return;
+ ## overlay with pickled data
+ filename=self.getCacheFilename()
+ if (os.path.isfile(filename)):
+ print "Loading from cache: "+filename
+ p = open(filename, 'rb')
+ data2 = cPickle.load(p)
+ for k in data2.keys():
+ FRUS[self.fru][k] = data2[k]
+
+ def __str__(self):
+ r = "Fru: "+str(self.fru_id)+"\n"
+ for f in self.data.keys():
+ r = r+f+" = "+str(self.data[f])+"\n"
+ return r
+
+
+
+class InventoryManager(dbus.service.Object):
+ def __init__(self,bus,name):
+ dbus.service.Object.__init__(self,bus,name)
+
+ bus.add_signal_receiver(self.UpdateFruHandler,
+ signal_name = 'UpdateFru')
+
+ self.fru_db = {}
+ self.fru_id_lookup = {}
+ self.sensor_id_lookup = {}
+
+ for fru_path in FRUS.keys():
+ self.addFru(fru_path)
+ f = FRUS[fru_path]
+ if (f.has_key('fru_id')):
+ self.fru_id_lookup[f['fru_id']] = fru_path
+ if (f.has_key('sensor_id')):
+ self.sensor_id_lookup[f['sensor_id']] = fru_path
+
+
+ def UpdateFruHandler(self,fru_id,data):
+ self.updateFru(fru_id,data)
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='y', out_signature='s')
+ def getFruSensor(self,sensor_id):
+ if (self.sensor_id_lookup.has_key(sensor_id) == False):
+ return ""
+ return self.sensor_id_lookup[sensor_id]
+
+ def addFru(self,fru_path):
+ new_fru = Fru(fru_path)
+ new_fru.loadFromCache()
+ self.fru_db[fru_path] = new_fru
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='ia{sv}', out_signature='')
+ def updateFruFromId(self,fru_id,data):
+ iid = int(fru_id)
+ if (self.fru_id_lookup.has_key(iid) == False):
+ # TODO: event log
+ print "fru id "+str(iid)+" not found"
+ else:
+ self.updateFru(self.fru_id_lookup[iid],data)
+
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='sa{sv}', out_signature='')
+ def updateFru(self,fru_path,data):
+ ## translate dbus data into basic data types
+ clean_data = {}
+ for k in data.keys():
+ d = Openbmc.DbusProperty(k,data[k])
+ clean_data[str(k)] = d.getBaseValue()
+
+ if (self.fru_db.has_key(fru_path)):
+ ## update properties then save to cache
+ print "Updating FRU: "+fru_path
+ self.fru_db[fru_path].update(clean_data)
+ self.fru_db[fru_path].saveToCache()
+
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='', out_signature='a{sa{sv}}')
+ def getFrus(self):
+ return FRUS
+
+
+if __name__ == '__main__':
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ bus = dbus.SessionBus()
+ name = dbus.service.BusName(DBUS_NAME,bus)
+ obj = InventoryManager(bus,OBJ_NAME)
+ mainloop = gobject.MainLoop()
+
+ print "Running Inventory Manager"
+ mainloop.run()
+
diff --git a/bin/ipmi_example.py b/bin/ipmi_example.py
new file mode 100644
index 0000000..a0c5a86
--- /dev/null
+++ b/bin/ipmi_example.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import PropertyManager
+
+import Openbmc
+
+
+
+def getWatchdog():
+ obj = bus.get_object('org.openbmc.watchdog.Host',
+ '/org/openbmc/watchdog/HostWatchdog_0')
+ intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
+ return intf
+
+def getChassisControl():
+ obj = bus.get_object('org.openbmc.control.Chassis',
+ '/org/openbmc/control/Chassis')
+ intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
+ return intf
+
+def prettyPrint(data):
+ for k in data.keys():
+ print k
+ for k2 in data[k].keys():
+ print "\t"+k2+" = "+str(data[k][k2])
+
+if __name__ == '__main__':
+ bus = dbus.SessionBus()
+ cmd = sys.argv[1]
+ data = None
+ ipmi_id = dbus.Byte(0)
+ if (len(sys.argv) > 2):
+ ipmi_id = dbus.Byte(int(sys.argv[2]))
+ if (len(sys.argv)>3):
+ data = sys.argv[3]
+
+ if (cmd == "poweron"):
+ intf = getChassisControl()
+ intf.powerOn()
+ elif (cmd == "poweroff"):
+ intf = getChassisControl()
+ intf.powerOff()
+ elif (cmd == "setsensor"):
+ intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
+ intf_sens.setSensorFromId(ipmi_id,data)
+ elif (cmd == "getsensor"):
+ intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
+ print intf_sens.getSensorFromId(ipmi_id)
+ elif (cmd == "getsensors"):
+ intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
+ data = intf_sens.getSensors()
+ prettyPrint(data)
+ elif (cmd == "updatefru"):
+ intf_fru = Openbmc.getManagerInterface(bus,"Inventory")
+ intf_fru.updateFruFromId(ipmi_id,data)
+ elif (cmd == "getfrus"):
+ intf_fru = Openbmc.getManagerInterface(bus,"Inventory")
+ data = intf_fru.getFrus()
+ prettyPrint(data)
+ elif (cmd == "pokewatchdog"):
+ intf = self.getWatchdog()
+ intf.poke()
+ elif (cmd == "statewatchdog"):
+ intf = self.getWatchdog()
+ intf.start()
+ else:
+ print "Unsupported command"
+
+
+
+
+
+
diff --git a/bin/ipmi_manager.py b/bin/ipmi_manager.py
deleted file mode 100644
index 24c36f4..0000000
--- a/bin/ipmi_manager.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import subprocess
-#from gi.repository import GObject
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import PropertyManager
-
-if (len(sys.argv) < 2):
- print "Usage: ipmi_manager.py [system name]"
- exit(1)
-
-System = __import__(sys.argv[1])
-import Openbmc
-
-DBUS_NAME = 'org.openbmc.managers.Ipmi'
-OBJ_NAME = '/org/openbmc/managers/Ipmi'
-
-
-class IpmiManager(dbus.service.Object):
- def __init__(self,bus,name):
- dbus.service.Object.__init__(self,bus,name)
-
- ## IPMI commands
- @dbus.service.method(DBUS_NAME,
- in_signature='yv', out_signature='')
- def setSensor(self,sensor_id,value):
- intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
- intf_sens.setSensorFromId(sensor_id,value)
-
- @dbus.service.method(DBUS_NAME,
- in_signature='y', out_signature='v')
- def getSensor(self,sensor_id):
- intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
- return intf_sens.getSensorFromId(sensor_id)
-
- @dbus.service.method(DBUS_NAME,
- in_signature='ia{sv}', out_signature='')
- def updateFru(self,fru_id,data):
- intf_fru = Openbmc.getManagerInterface(bus,"Frus")
- intf_fru.updateFru(fru_id,data)
-
- @dbus.service.method(DBUS_NAME,
- in_signature='', out_signature='s')
- def getFrus(self):
- intf_fru = Openbmc.getManagerInterface(bus,"Frus")
- return intf_fru.getFrus()
-
-
- @dbus.service.method(DBUS_NAME,
- in_signature='', out_signature='')
- def pokeHostWatchdog(self):
- ## TODO don't do hardcoding
- obj = bus.get_object('org.openbmc.watchdog.Host',
- '/org/openbmc/watchdog/HostWatchdog_0')
- intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
- intf.poke()
- return None
-
- @dbus.service.method(DBUS_NAME,
- in_signature='', out_signature='')
- def startHostWatchdog(self):
- ## TODO don't do hardcoding
- obj = bus.get_object('org.openbmc.watchdog.Host',
- '/org/openbmc/watchdog/HostWatchdog_0')
- intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
- intf.start()
- return None
-
- @dbus.service.method(DBUS_NAME,
- in_signature='', out_signature='')
- def powerOn(self):
- ## TODO don't do hardcoding
- obj = bus.get_object('org.openbmc.control.Chassis',
- '/org/openbmc/control/Chassis')
- intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
- intf.powerOn()
- return None
-
- @dbus.service.method(DBUS_NAME,
- in_signature='', out_signature='')
- def powerOff(self):
- ## TODO don't do hardcoding
- obj = bus.get_object('org.openbmc.control.Chassis',
- '/org/openbmc/control/Chassis')
- intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
- intf.powerOff()
- return None
-
-
-
-
-if __name__ == '__main__':
- dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
- bus = dbus.SessionBus()
- name = dbus.service.BusName(DBUS_NAME,bus)
- obj = IpmiManager(bus,OBJ_NAME)
- mainloop = gobject.MainLoop()
-
- print "Running IpmiManager"
- mainloop.run()
-
diff --git a/bin/ipmitool.py b/bin/ipmitool.py
deleted file mode 100644
index 973f071..0000000
--- a/bin/ipmitool.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import subprocess
-import dbus
-from gi.repository import GObject
-import dbus.service
-import dbus.mainloop.glib
-import Openbmc
-
-
-if __name__ == '__main__':
- cmd = sys.argv[1]
- data = None
- ipmi_id = dbus.Byte(0)
- if (len(sys.argv) > 2):
- ipmi_id = dbus.Byte(int(sys.argv[2]))
- if (len(sys.argv)>3):
- data = sys.argv[3]
-
- bus = dbus.SessionBus()
- intf = Openbmc.getManagerInterface(bus,"Ipmi")
-
- if (cmd == 'updatefru'):
- d = { 'manufacturer' : data }
- intf.updateFru(ipmi_id,d)
- elif (cmd == 'getfrus'):
- print intf.getFrus()
- elif (cmd == 'setsensor'):
- data_b = dbus.Byte(int(data))
- intf.setSensor(ipmi_id,data_b)
- elif (cmd == 'getsensor'):
- print intf.getSensor(ipmi_id)
- elif (cmd == 'pokewatchdog'):
- print intf.pokeHostWatchdog()
- elif (cmd == 'startwatchdog'):
- print intf.startHostWatchdog()
- elif (cmd == 'poweron'):
- print intf.powerOn()
- elif (cmd == 'poweroff'):
- print intf.powerOff()
- else:
- print "ERROR: Invalid command"
- print "Valid commands: updatefru, setsensor, getsensor, startwatchdog, pokewatchdog"
-
- #mainloop.run()
-
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
index 9a193d6..4d8eccd 100644
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -39,9 +39,7 @@
@dbus.service.method(DBUS_NAME,
in_signature='', out_signature='a{sa{sv}}')
- def getSensorsAll(self):
- ## this is probably not ok
- ##sensors = []
+ def getSensors(self):
return self.sensor_cache;
@dbus.service.method(DBUS_NAME,
@@ -56,6 +54,15 @@
@dbus.service.method(DBUS_NAME,
in_signature='yv', out_signature='')
def setSensorFromId(self,ipmi_id,value):
+ ## first check if fru functional sensor
+ intf_inv = Openbmc.getManagerInterface(bus,"Inventory")
+ fru_path = intf_inv.getFruSensor(ipmi_id)
+ if (fru_path != ""):
+ data = { 'state': value }
+ intf_inv.updateFru(fru_path,data)
+ print "Found Fru Based Sensor: "+fru_path
+ return None
+
intf_sys = Openbmc.getManagerInterface(bus,"System")
obj_info = intf_sys.getObjFromIpmi(ipmi_id)
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 015aa8d..b852543 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -56,6 +56,14 @@
def SystemStateHandler(self,state_name):
+ print "Checking previous state started..."
+ i = 0
+ not_started=True
+ while(i<10 and not_started):
+ not_started = self.check_state_started()
+ i=i+1
+ # add sleep
+
print "Running System State: "+state_name
if (self.system_states.has_key(state_name)):
for bus_name in self.system_states[state_name]:
@@ -67,22 +75,23 @@
if (System.ENTER_STATE_CALLBACK.has_key(state_name)):
cb = System.ENTER_STATE_CALLBACK[state_name]
- obj = bus.get_object(cb['bus_name'],cb['obj_name'])
+ obj = bus.get_<F11>object(cb['bus_name'],cb['obj_name'])
method = obj.get_dbus_method(cb['method_name'],cb['interface_name'])
method()
- current_state = state_name
+ self.current_state = state_name
def start_process(self,bus_name):
if (System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
process_name = System.BIN_PATH+System.SYSTEM_CONFIG[bus_name]['process_name']
cmdline = [ ]
cmdline.append(process_name)
+ System.SYSTEM_CONFIG[bus_name]['popen'] = None
for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
cmdline.append(instance['name'])
try:
print "Starting process: "+" ".join(cmdline)+": "+bus_name
- System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline);
+ System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline)
except Exception as e:
## TODO: error
print "Error starting process: "+" ".join(cmdline)
@@ -124,13 +133,26 @@
#print "Heartbeat seen: "+bus_name
System.SYSTEM_CONFIG[bus_name]['heartbeat_count']=1
+ def check_state_started(self):
+ r = True
+ if (self.current_state == ""):
+ return True
+ for bus_name in self.system_states[self.current_state]:
+ if (System.SYSTEM_CONFIG[bus_name].has_key('popen') == False and
+ System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
+ print "Not found: "+bus_name
+ r = False
+ break;
+ return r
+
+
def NewBusHandler(self, bus_name, a, b):
if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
if (System.SYSTEM_CONFIG.has_key(bus_name)):
System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
objects = {}
- Openbmc.get_objs(bus,bus_name,Openbmc.OBJ_PREFIX,objects)
-
+ Openbmc.get_objs(bus,bus_name,Openbmc.OBJ_PREFIX,objects)
+
for instance_name in objects.keys():
obj_path = objects[instance_name]['PATH']
for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
diff --git a/includes/gpio.c b/includes/gpio.c
index 1bd10a7..b4b6139 100644
--- a/includes/gpio.c
+++ b/includes/gpio.c
@@ -13,6 +13,7 @@
int gpio_writec(GPIO* gpio, char value)
{
+ g_assert (gpio != NULL);
int rc = GPIO_OK;
char buf[1];
buf[0] = value;
@@ -25,6 +26,7 @@
int gpio_write(GPIO* gpio, uint8_t value)
{
+ g_assert (gpio != NULL);
int rc = GPIO_OK;
char buf[1];
buf[0] = '0';
@@ -41,6 +43,7 @@
int gpio_read(GPIO* gpio, uint8_t *value)
{
+ g_assert (gpio != NULL);
char buf[1];
int r = GPIO_OK;
if (gpio->fd <= 0)
@@ -63,6 +66,7 @@
return r;
}
int gpio_clock_cycle(GPIO* gpio, int num_clks) {
+ g_assert (gpio != NULL);
int i=0;
int r=GPIO_OK;
for (i=0;i<num_clks;i++) {
@@ -168,9 +172,13 @@
int gpio_open(GPIO* gpio)
{
+ g_assert (gpio != NULL);
// open gpio for writing or reading
char buf[254];
int rc = 0;
+ if (gpio->direction == NULL) {
+ return GPIO_OPEN_ERROR;
+ }
if (strcmp(gpio->direction,"in")==0)
{
sprintf(buf, "%s/gpio%d/value", gpio->dev, gpio->num);
diff --git a/includes/openbmc.h b/includes/openbmc.h
index bb6660b..576d3a4 100644
--- a/includes/openbmc.h
+++ b/includes/openbmc.h
@@ -16,16 +16,18 @@
#ifdef __arm__
-static inline void write_reg(uint32_t val,void* addr)
+static inline void devmem(void* addr, uint32_t val)
{
+ printf("devmem 0x%08x = 0x%08x\n",addr,val);
asm volatile("" : : : "memory");
*(volatile uint32_t *)addr = val;
}
-static inline devmem(uint32_t val, uint32_t reg)
-{
- void* r = (void*)reg;
- write_reg(val,r);
-}
+//static inline devmem(uint32_t reg, uint32_t val)
+//{
+// printf("devmem 0x%08x = 0x%08x\n",reg,val);
+// //void* r = (void*)reg;
+ // write_reg(reg,val);
+//}
#else
static inline devmem(uint32_t val, uint32_t reg)
{
diff --git a/objects/control_bmc_obj.c b/objects/control_bmc_obj.c
index 7e9965f..9ceaf9b 100644
--- a/objects/control_bmc_obj.c
+++ b/objects/control_bmc_obj.c
@@ -14,46 +14,94 @@
static const gchar* dbus_object_path = "/org/openbmc/control";
static const gchar* dbus_name = "org.openbmc.control.Bmc";
+//this probably should come from some global SOC config
+
+#define LPC_BASE 0x1e789000
+#define LPC_HICR6 0x80
+#define LPC_HICR7 0x88
+#define LPC_HICR8 0x8c
+
+#define SPI_BASE 0x1e630000
+#define SCU_BASE 0x1e780000
+#define UART_BASE 0x1e783000
+#define COM_BASE 0x1e789000
+#define GPIO_BASE 0x1e6e2000
static GDBusObjectManagerServer *manager = NULL;
+void* memmap(int mem_fd,uint32_t* base)
+{
+ void* bmcreg;
+ bmcreg = mmap(NULL, getpagesize(),
+ PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, base);
+
+ if (bmcreg == MAP_FAILED) {
+ perror("Unable to map LPC register memory");
+ exit(1);
+ }
+ return bmcreg;
+}
+
+void reg_init()
+{
+ g_print("BMC init\n");
+ // BMC init done here
+
+ void *bmcreg;
+ int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
+ if (mem_fd < 0) {
+ perror("Unable to open /dev/mem");
+ exit(1);
+ }
+
+ bmcreg = memmap(mem_fd,LPC_BASE);
+ devmem(bmcreg+LPC_HICR6,0x00000500); //Enable LPC FWH cycles, Enable LPC to AHB bridge
+ devmem(bmcreg+LPC_HICR7,0x30000E00); //32M PNOR
+ devmem(bmcreg+LPC_HICR8,0xFE0001FF);
+
+ //flash controller
+ bmcreg = memmap(mem_fd,SPI_BASE);
+ devmem(bmcreg+0x00,0x00000003);
+ devmem(bmcreg+0x04,0x00002404);
+
+ //UART
+
+
+ bmcreg = memmap(mem_fd,UART_BASE);
+ devmem(bmcreg+0x00,0x00000000); //Set Baud rate divisor -> 13 (Baud 115200)
+ devmem(bmcreg+0x04,0x00000000); //Set Baud rate divisor -> 13 (Baud 115200)
+ devmem(bmcreg+0x08,0x000000c1); //Disable Parity, 1 stop bit, 8 bits
+ bmcreg = memmap(mem_fd,COM_BASE);
+ devmem(bmcreg+0x9C,0x00000000); //Set routing UART1 -> COM 1
+
+ bmcreg = memmap(mem_fd,SCU_BASE);
+ devmem(bmcreg+0x00,0x13008CE7);
+ devmem(bmcreg+0x04,0x0370E677);
+ devmem(bmcreg+0x20,0xDF48F7FF);
+ devmem(bmcreg+0x24,0xC738F202);
+
+
+ //GPIO
+ bmcreg = memmap(mem_fd,GPIO_BASE);
+ devmem(bmcreg+0x84,0x00fff0c0); //Enable UART1
+ devmem(bmcreg+0x70,0x120CE406);
+ devmem(bmcreg+0x80,0xCB000000);
+ devmem(bmcreg+0x88,0x01C000FF);
+ devmem(bmcreg+0x8c,0xC1C000FF);
+ devmem(bmcreg+0x90,0x003FA009);
+
+
+ close(mem_fd);
+}
+
static gboolean
on_init (Control *control,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
- g_print("BMC init\n");
- // BMC init done here
- /*
- devmem(0x1e789080,0x00000500); //Enable LPC FWH cycles, Enable LPC to AHB bridge
- devmem(0x1e789088,0x30000E00); //32M PNOR
- devmem(0x1e78908C,0xFE0001FF);
-
- //flash controller
- devmem(0x1e630000,0x00000003);
- devmem(0x1e630004,0x00002404);
-
- //UART
- devmem(0x1e6e2084,0x00fff0c0); //Enable UART1
- devmem(0x1e783000,0x00000000); //Set Baud rate divisor -> 13 (Baud 115200)
- devmem(0x1e783004,0x00000000); //Set Baud rate divisor -> 13 (Baud 115200)
- devmem(0x1e783008,0x000000c1); //Disable Parity, 1 stop bit, 8 bits
- devmem(0x1E78909C,0x00000000); //Set routing UART1 -> COM 1
-
-
- //GPIO
- devmem(0x1e6e2070,0x120CE406);
- devmem(0x1e6e2080,0xCB000000);
- devmem(0x1e6e2088,0x01C000FF);
- devmem(0x1e6e208c,0xC1C000FF);
- devmem(0x1e6e2090,0x003FA009);
-
- devmem(0x1E780000,0x13008CE7);
- devmem(0x1E780004,0x0370E677);
- devmem(0x1E780020,0xDF48F7FF);
- devmem(0x1E780024,0xC738F202);
-*/
-
+ #ifdef __arm__
+ reg_init();
+ #endif
control_complete_init(control,invocation);
control_emit_goto_system_state(control,"STANDBY");
@@ -106,7 +154,6 @@
}
/* Export all objects */
g_dbus_object_manager_server_set_connection (manager, connection);
-
}
static void
diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
index bb95d17..4c40708 100644
--- a/objects/flash_bios_obj.c
+++ b/objects/flash_bios_obj.c
@@ -13,9 +13,11 @@
GDBusMethodInvocation *invocation,
gpointer user_data)
{
- flash_complete_init(f,invocation);
- return TRUE;
-
+ flash_complete_init(f,invocation);
+ //tune flash
+ g_print("Tuning BIOS Flash\n");
+ flash_access_setup_pnor(true, false, false);
+ return TRUE;
}
static gboolean
diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
index 53df62d..bb0eaec 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -52,18 +52,6 @@
pgood_timeout_start = 0;
return TRUE;
}
- //For simulation, remove
- /*
- if (tmp_pgood!=last_pgood) {
- if (tmp_pgood == 1) {
- control_emit_goto_system_state(control,"POWERED_ON");
- } else {
- control_emit_goto_system_state(control,"POWERED_OFF");
- }
- }
-
- last_pgood = tmp_pgood;
- */
uint8_t gpio;
int rc = gpio_open(&pgood);
@@ -91,7 +79,7 @@
//return FALSE;
}
//pgood is not at desired state yet
- g_print("GPIO: %d; %d\n",gpio,control_power_get_state(control_power));
+ //g_print("GPIO: %d; %d\n",gpio,control_power_get_state(control_power));
if (gpio != control_power_get_state(control_power) &&
control_power_get_pgood_timeout(control_power) > 0)
{
@@ -238,27 +226,22 @@
// get gpio device paths
int rc = GPIO_OK;
do {
-
rc = gpio_init(connection,&power_pin);
if (rc != GPIO_OK) { break; }
rc = gpio_init(connection,&pgood);
if (rc != GPIO_OK) { break; }
+ uint8_t gpio;
rc = gpio_open(&pgood);
-
+ if (rc != GPIO_OK) { break; }
+ rc = gpio_read(&pgood,&gpio);
+ if (rc != GPIO_OK) { break; }
+ gpio_close(&pgood);
+ control_power_set_pgood(control_power,gpio);
} while(0);
if (rc != GPIO_OK)
{
event_log_emit_event_log(event_log, LOG_ALERT, "GPIO setup error",rc);
- }
- int rc = gpio_open(&pgood);
- rc = gpio_read(&pgood,&gpio);
- gpio_close(&pgood);
- if (rc == GPIO_OK) {
- control_power_set_pgood(control_power,gpio);
-
- } else {
- }
-
+ }
}
static void