Merge pull request #65 from bradbishop/occ-sensor-path

Allow sysfs path to be passed to OCC sensor
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..28e70be
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+lib/*
+obj/*
+bin/*.exe
+bin/pflash
+*.swp
+*.swo
diff --git a/Makefile b/Makefile
index 8a88a37..7129082 100755
--- a/Makefile
+++ b/Makefile
@@ -35,27 +35,27 @@
 libopenbmc_intf: openbmc_intf.o
 	$(CC) -shared -o lib/$@.so obj/openbmc_intf.o $(LDFLAGS)
 
-power_control: power_control_obj.o gpio.o object_mapper.o libopenbmc_intf
-	$(CC) -o bin/$@.exe obj/gpio.o obj/power_control_obj.o obj/object_mapper.o $(LDFLAGS) $(LIBS)
+power_control: power_control_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/gpio.o obj/power_control_obj.o $(LDFLAGS) $(LIBS)
 
 led_controller: led_controller.o
 	$(CC) -o bin/$@.exe obj/led_controller.o $(LDFLAGS) $(LIB_FLAG)
 
-button_power: button_power_obj.o gpio.o object_mapper.o libopenbmc_intf
-	$(CC) -o bin/$@.exe obj/button_power_obj.o obj/gpio.o obj/object_mapper.o $(LDFLAGS) $(LIBS)
+button_power: button_power_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/button_power_obj.o obj/gpio.o $(LDFLAGS) $(LIBS)
 
-button_reset: button_reset_obj.o gpio.o object_mapper.o libopenbmc_intf
-	$(CC) -o bin/$@.exe obj/button_reset_obj.o obj/gpio.o obj/object_mapper.o $(LDFLAGS) $(LIBS)
+button_reset: button_reset_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/button_reset_obj.o obj/gpio.o $(LDFLAGS) $(LIBS)
 
 
-control_host: control_host_obj.o gpio.o object_mapper.o libopenbmc_intf
-	$(CC) -o bin/$@.exe obj/gpio.o obj/control_host_obj.o obj/object_mapper.o $(LDFLAGS) $(LIBS)
+control_host: control_host_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/gpio.o obj/control_host_obj.o $(LDFLAGS) $(LIBS)
 
-flash_bios:  flash_bios_obj.o object_mapper.o libopenbmc_intf
-	$(CC) -o bin/$@.exe obj/flash_bios_obj.o obj/object_mapper.o $(LDFLAGS) $(LIBS)
+flash_bios:  flash_bios_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/flash_bios_obj.o $(LDFLAGS) $(LIBS)
 
-host_watchdog: host_watchdog_obj.o object_mapper.o libopenbmc_intf
-	$(CC) -o bin/$@.exe obj/host_watchdog_obj.o obj/object_mapper.o  $(LDFLAGS) $(LIBS)
+host_watchdog: host_watchdog_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/host_watchdog_obj.o $(LDFLAGS) $(LIBS)
 
 board_vpd: board_vpd_obj.o libopenbmc_intf
 	$(CC) -o bin/$@.exe obj/board_vpd_obj.o $(LDFLAGS) $(LIBS)
@@ -69,8 +69,8 @@
 pflash:  $(OBJS2) pflash.o
 	$(CC) -o bin/$@ obj/pflash.o $(OBJS3) $(LDFLAGS)
 
-hwmons_barreleye: hwmons_barreleye.o object_mapper.o libopenbmc_intf
-	$(CC) -o bin/$@.exe obj/hwmons_barreleye.o obj/object_mapper.o  $(LDFLAGS) $(LIBS)
+hwmons_barreleye: hwmons_barreleye.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/hwmons_barreleye.o $(LDFLAGS) $(LIBS)
 
 control_bmc: control_bmc_obj.o libopenbmc_intf
 	$(CC) -o bin/$@.exe obj/control_bmc_obj.o $(LDFLAGS) $(LIBS)
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index 09fefa0..0cf55a1 100755
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -385,7 +385,6 @@
 		'BOARD_3'    : '<inventory_root>/system/misc',
 		'PRODUCT_51' : '<inventory_root>/system/misc',
 		'PRODUCT_100': '<inventory_root>/system',
-		'CHASSIS_2'  : '<inventory_root>/system/chassis',
 		'CHASSIS_100': '<inventory_root>/system/chassis',
 		'BOARD_100'  : '<inventory_root>/system/chassis/io_board',
 		'BOARD_101'  : '<inventory_root>/system/chassis/sas_expander',
diff --git a/bin/Firestone.py b/bin/Firestone.py
new file mode 100755
index 0000000..91a6099
--- /dev/null
+++ b/bin/Firestone.py
@@ -0,0 +1,610 @@
+#! /usr/bin/python
+
+HOME_PATH = './'
+CACHE_PATH = '/var/cache/obmc/'
+FLASH_DOWNLOAD_PATH = "/tmp"
+GPIO_BASE = 320
+SYSTEM_NAME = "Firestone"
+
+
+## System states
+##   state can change to next state in 2 ways:
+##   - a process emits a GotoSystemState signal with state name to goto
+##   - objects specified in EXIT_STATE_DEPEND have started
+SYSTEM_STATES = [
+    'BASE_APPS',
+    'BMC_STARTING',
+    'BMC_READY',
+    'HOST_POWERING_ON',
+    'HOST_POWERED_ON',
+    'HOST_BOOTING',
+    'HOST_BOOTED',
+    'HOST_POWERED_OFF',
+]
+
+EXIT_STATE_DEPEND = {
+    'BASE_APPS' : {
+        '/org/openbmc/sensors': 0,
+    },
+    'BMC_STARTING' : {
+        '/org/openbmc/control/chassis0': 0,
+        '/org/openbmc/control/power0' : 0,
+        '/org/openbmc/control/host0' : 0,
+        '/org/openbmc/control/flash/bios' : 0,
+    },
+}
+
+## method will be called when state is entered
+ENTER_STATE_CALLBACK = {
+    'HOST_POWERED_ON' : {
+        'boot' : {
+            'bus_name'    : 'org.openbmc.control.Host',
+            'obj_name'    : '/org/openbmc/control/host0',
+            'interface_name' : 'org.openbmc.control.Host',
+        },
+    },
+    'HOST_POWERED_OFF' : {
+        'setOff' : {
+            'bus_name'   : 'org.openbmc.control.led',
+            'obj_name'   : '/org/openbmc/control/led/identify',
+            'interface_name' : 'org.openbmc.Led',
+        }
+    },
+    'BMC_READY' : {
+        'setOn' : {
+            'bus_name'   : 'org.openbmc.control.led',
+            'obj_name'   : '/org/openbmc/control/led/beep',
+            'interface_name' : 'org.openbmc.Led',
+        },
+        'init' : {
+            'bus_name'   : 'org.openbmc.control.Flash',
+            'obj_name'   : '/org/openbmc/control/flash/bios',
+            'interface_name' : 'org.openbmc.Flash',
+        }
+    }
+}
+
+APPS = {
+    'startup_hacks' : {
+        'system_state'    : 'BASE_APPS',
+        'start_process'   : True,
+        'monitor_process' : False,
+        'process_name'    : 'startup_hacks.sh',
+    },
+    'inventory' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'inventory_items.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'hwmon' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'hwmon.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'sensor_manager' : {
+        'system_state'    : 'BASE_APPS',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'sensor_manager2.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'host_watchdog' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'host_watchdog.exe',
+    },
+    'power_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name' : 'power_control.exe',
+        'args' : [ '3000', '10' ]
+    },
+    'power_button' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'button_power.exe',
+    },
+    'reset_button' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'button_reset.exe',
+    },
+    'led_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'led_controller.exe',
+    },
+    'flash_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'flash_bios.exe',
+    },
+    'bmc_flash_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'bmc_update.py',
+    },
+    'download_manager' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'download_manager.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'host_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'control_host.exe',
+    },
+    'chassis_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'chassis_control.py',
+    },
+    'restore' : {
+        'system_state'    : 'BMC_READY',
+        'start_process'   : True,
+        'monitor_process' : False,
+        'process_name'    : 'discover_system_state.py',
+    },
+    'bmc_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'control_bmc.exe',
+    },
+}
+
+CACHED_INTERFACES = {
+        "org.openbmc.InventoryItem" : True,
+        "org.openbmc.control.Chassis" : True,
+}
+
+INVENTORY_ROOT = '/org/openbmc/inventory'
+
+FRU_INSTANCES = {
+    '<inventory_root>/system' : { 'fru_type' : 'SYSTEM','is_fru' : True, 'present' : "True" },
+    '<inventory_root>/system/bios' : { 'fru_type' : 'SYSTEM','is_fru' : True, 'present' : "True" },
+    '<inventory_root>/system/misc' : { 'fru_type' : 'SYSTEM','is_fru' : False, },
+
+    '<inventory_root>/system/chassis' : { 'fru_type' : 'SYSTEM','is_fru' : True, 'present' : "True" },
+
+    '<inventory_root>/system/chassis/motherboard' : { 'fru_type' : 'MAIN_PLANAR','is_fru' : True, },
+
+    '<inventory_root>/system/systemevent'                  : { 'fru_type' : 'SYSTEM_EVENT', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/refclock' : { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/pcieclock': { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/todclock' : { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/apss'     : { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/fan0' : { 'fru_type' : 'FAN','is_fru' : True, },
+    '<inventory_root>/system/chassis/fan1' : { 'fru_type' : 'FAN','is_fru' : True, },
+    '<inventory_root>/system/chassis/fan2' : { 'fru_type' : 'FAN','is_fru' : True, },
+    '<inventory_root>/system/chassis/fan3' : { 'fru_type' : 'FAN','is_fru' : True, },
+
+    '<inventory_root>/system/chassis/motherboard/bmc' : { 'fru_type' : 'BMC','is_fru' : False, 'manufacturer' : 'ASPEED' },
+
+    '<inventory_root>/system/chassis/motherboard/cpu0' : { 'fru_type' : 'CPU', 'is_fru' : True, },
+    '<inventory_root>/system/chassis/motherboard/cpu1' : { 'fru_type' : 'CPU', 'is_fru' : True, },
+
+    '<inventory_root>/system/chassis/motherboard/cpu0/core0' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core1' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core2' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core3' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core4' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core5' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core6' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core7' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core8' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core9' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core10': { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core11': { 'fru_type' : 'CORE', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/motherboard/cpu1/core0' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core1' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core2' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core3' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core4' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core5' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core6' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core7' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core8' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core9' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core10' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core11' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/motherboard/membuf0' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf1' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf2' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf3' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf4' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf5' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf6' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf7' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/motherboard/dimm0' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm1' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm2' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm3' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm4' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm5' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm6' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm7' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm8' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm9' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm10' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm11' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm12' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm13' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm14' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm15' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm16' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm17' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm18' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm19' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm20' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm21' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm22' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm23' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm24' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm25' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm26' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm27' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm28' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm29' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm30' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm31' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+}
+
+ID_LOOKUP = {
+    'FRU' : {
+        0x01 : '<inventory_root>/system/chassis/motherboard/cpu0',
+        0x02 : '<inventory_root>/system/chassis/motherboard/cpu1',
+        0x03 : '<inventory_root>/system/chassis/motherboard',
+        0x04 : '<inventory_root>/system/chassis/motherboard/membuf0',
+        0x05 : '<inventory_root>/system/chassis/motherboard/membuf1',
+        0x06 : '<inventory_root>/system/chassis/motherboard/membuf2',
+        0x07 : '<inventory_root>/system/chassis/motherboard/membuf3',
+        0x08 : '<inventory_root>/system/chassis/motherboard/membuf4',
+        0x09 : '<inventory_root>/system/chassis/motherboard/membuf5',
+        0x0c : '<inventory_root>/system/chassis/motherboard/dimm0',
+        0x0d : '<inventory_root>/system/chassis/motherboard/dimm1',
+        0x0e : '<inventory_root>/system/chassis/motherboard/dimm2',
+        0x0f : '<inventory_root>/system/chassis/motherboard/dimm3',
+        0x10 : '<inventory_root>/system/chassis/motherboard/dimm4',
+        0x11 : '<inventory_root>/system/chassis/motherboard/dimm5',
+        0x12 : '<inventory_root>/system/chassis/motherboard/dimm6',
+        0x13 : '<inventory_root>/system/chassis/motherboard/dimm7',
+        0x14 : '<inventory_root>/system/chassis/motherboard/dimm8',
+        0x15 : '<inventory_root>/system/chassis/motherboard/dimm9',
+        0x16 : '<inventory_root>/system/chassis/motherboard/dimm10',
+        0x17 : '<inventory_root>/system/chassis/motherboard/dimm11',
+        0x18 : '<inventory_root>/system/chassis/motherboard/dimm12',
+        0x19 : '<inventory_root>/system/chassis/motherboard/dimm13',
+        0x1a : '<inventory_root>/system/chassis/motherboard/dimm14',
+        0x1b : '<inventory_root>/system/chassis/motherboard/dimm15',
+        0x1c : '<inventory_root>/system/chassis/motherboard/dimm16',
+        0x1d : '<inventory_root>/system/chassis/motherboard/dimm17',
+        0x1e : '<inventory_root>/system/chassis/motherboard/dimm18',
+        0x1f : '<inventory_root>/system/chassis/motherboard/dimm19',
+        0x20 : '<inventory_root>/system/chassis/motherboard/dimm20',
+        0x21 : '<inventory_root>/system/chassis/motherboard/dimm21',
+        0x22 : '<inventory_root>/system/chassis/motherboard/dimm22',
+        0x23 : '<inventory_root>/system/chassis/motherboard/dimm23',
+        0x24 : '<inventory_root>/system/chassis/motherboard/dimm24',
+        0x25 : '<inventory_root>/system/chassis/motherboard/dimm25',
+        0x26 : '<inventory_root>/system/chassis/motherboard/dimm26',
+        0x27 : '<inventory_root>/system/chassis/motherboard/dimm27',
+        0x28 : '<inventory_root>/system/chassis/motherboard/dimm28',
+        0x29 : '<inventory_root>/system/chassis/motherboard/dimm29',
+        0x2a : '<inventory_root>/system/chassis/motherboard/dimm30',
+        0x2b : '<inventory_root>/system/chassis/motherboard/dimm31',
+    },
+    'FRU_STR' : {
+        'PRODUCT_0'  : '<inventory_root>/system/bios',
+        'BOARD_1'    : '<inventory_root>/system/chassis/motherboard/cpu0',
+        'BOARD_2'    : '<inventory_root>/system/chassis/motherboard/cpu1',
+        'CHASSIS_3'  : '<inventory_root>/system/chassis/motherboard',
+        'BOARD_3'    : '<inventory_root>/system/misc',
+        'BOARD_4'    : '<inventory_root>/system/chassis/motherboard/membuf0',
+        'BOARD_5'    : '<inventory_root>/system/chassis/motherboard/membuf1',
+        'BOARD_6'    : '<inventory_root>/system/chassis/motherboard/membuf2',
+        'BOARD_7'    : '<inventory_root>/system/chassis/motherboard/membuf3',
+        'BOARD_8'    : '<inventory_root>/system/chassis/motherboard/membuf4',
+        'BOARD_9'    : '<inventory_root>/system/chassis/motherboard/membuf5',
+        'BOARD_10'   : '<inventory_root>/system/chassis/motherboard/membuf6',
+        'BOARD_11'   : '<inventory_root>/system/chassis/motherboard/membuf7',
+        'PRODUCT_12'   : '<inventory_root>/system/chassis/motherboard/dimm0',
+        'PRODUCT_13'   : '<inventory_root>/system/chassis/motherboard/dimm1',
+        'PRODUCT_14'   : '<inventory_root>/system/chassis/motherboard/dimm2',
+        'PRODUCT_15'   : '<inventory_root>/system/chassis/motherboard/dimm3',
+        'PRODUCT_16'   : '<inventory_root>/system/chassis/motherboard/dimm4',
+        'PRODUCT_17'   : '<inventory_root>/system/chassis/motherboard/dimm5',
+        'PRODUCT_18'   : '<inventory_root>/system/chassis/motherboard/dimm6',
+        'PRODUCT_19'   : '<inventory_root>/system/chassis/motherboard/dimm7',
+        'PRODUCT_20'   : '<inventory_root>/system/chassis/motherboard/dimm8',
+        'PRODUCT_21'   : '<inventory_root>/system/chassis/motherboard/dimm9',
+        'PRODUCT_22'   : '<inventory_root>/system/chassis/motherboard/dimm10',
+        'PRODUCT_23'   : '<inventory_root>/system/chassis/motherboard/dimm11',
+        'PRODUCT_24'   : '<inventory_root>/system/chassis/motherboard/dimm12',
+        'PRODUCT_25'   : '<inventory_root>/system/chassis/motherboard/dimm13',
+        'PRODUCT_26'   : '<inventory_root>/system/chassis/motherboard/dimm14',
+        'PRODUCT_27'   : '<inventory_root>/system/chassis/motherboard/dimm15',
+        'PRODUCT_28'   : '<inventory_root>/system/chassis/motherboard/dimm16',
+        'PRODUCT_29'   : '<inventory_root>/system/chassis/motherboard/dimm17',
+        'PRODUCT_30'   : '<inventory_root>/system/chassis/motherboard/dimm18',
+        'PRODUCT_31'   : '<inventory_root>/system/chassis/motherboard/dimm19',
+        'PRODUCT_32'   : '<inventory_root>/system/chassis/motherboard/dimm20',
+        'PRODUCT_33'   : '<inventory_root>/system/chassis/motherboard/dimm21',
+        'PRODUCT_34'   : '<inventory_root>/system/chassis/motherboard/dimm22',
+        'PRODUCT_35'   : '<inventory_root>/system/chassis/motherboard/dimm23',
+        'PRODUCT_36'   : '<inventory_root>/system/chassis/motherboard/dimm24',
+        'PRODUCT_37'   : '<inventory_root>/system/chassis/motherboard/dimm25',
+        'PRODUCT_38'   : '<inventory_root>/system/chassis/motherboard/dimm26',
+        'PRODUCT_39'   : '<inventory_root>/system/chassis/motherboard/dimm27',
+        'PRODUCT_40'   : '<inventory_root>/system/chassis/motherboard/dimm28',
+        'PRODUCT_41'   : '<inventory_root>/system/chassis/motherboard/dimm29',
+        'PRODUCT_42'   : '<inventory_root>/system/chassis/motherboard/dimm30',
+        'PRODUCT_43'   : '<inventory_root>/system/chassis/motherboard/dimm31',
+        'PRODUCT_47'   : '<inventory_root>/system/misc',
+    },
+    'SENSOR' : {
+        0x04 : '/org/openbmc/sensors/host/HostStatus',
+        0x05 : '/org/openbmc/sensors/host/BootProgress',
+        0x08 : '/org/openbmc/sensors/host/cpu0/OccStatus',
+        0x09 : '/org/openbmc/sensors/host/cpu1/OccStatus',
+        0x0c : '<inventory_root>/system/chassis/motherboard/cpu0',
+        0x0e : '<inventory_root>/system/chassis/motherboard/cpu1',
+        0x1e : '<inventory_root>/system/chassis/motherboard/dimm3',
+        0x1f : '<inventory_root>/system/chassis/motherboard/dimm2',
+        0x20 : '<inventory_root>/system/chassis/motherboard/dimm1',
+        0x21 : '<inventory_root>/system/chassis/motherboard/dimm0',
+        0x22 : '<inventory_root>/system/chassis/motherboard/dimm7',
+        0x23 : '<inventory_root>/system/chassis/motherboard/dimm6',
+        0x24 : '<inventory_root>/system/chassis/motherboard/dimm5',
+        0x25 : '<inventory_root>/system/chassis/motherboard/dimm4',
+        0x26 : '<inventory_root>/system/chassis/motherboard/dimm11',
+        0x27 : '<inventory_root>/system/chassis/motherboard/dimm10',
+        0x28 : '<inventory_root>/system/chassis/motherboard/dimm9',
+        0x29 : '<inventory_root>/system/chassis/motherboard/dimm8',
+        0x2a : '<inventory_root>/system/chassis/motherboard/dimm15',
+        0x2b : '<inventory_root>/system/chassis/motherboard/dimm14',
+        0x2c : '<inventory_root>/system/chassis/motherboard/dimm13',
+        0x2d : '<inventory_root>/system/chassis/motherboard/dimm12',
+        0x2e : '<inventory_root>/system/chassis/motherboard/dimm19',
+        0x2f : '<inventory_root>/system/chassis/motherboard/dimm18',
+        0x30 : '<inventory_root>/system/chassis/motherboard/dimm17',
+        0x31 : '<inventory_root>/system/chassis/motherboard/dimm16',
+        0x32 : '<inventory_root>/system/chassis/motherboard/dimm23',
+        0x33 : '<inventory_root>/system/chassis/motherboard/dimm22',
+        0x34 : '<inventory_root>/system/chassis/motherboard/dimm21',
+        0x35 : '<inventory_root>/system/chassis/motherboard/dimm20',
+        0x36 : '<inventory_root>/system/chassis/motherboard/dimm27',
+        0x37 : '<inventory_root>/system/chassis/motherboard/dimm26',
+        0x38 : '<inventory_root>/system/chassis/motherboard/dimm25',
+        0x39 : '<inventory_root>/system/chassis/motherboard/dimm24',
+        0x3a : '<inventory_root>/system/chassis/motherboard/dimm31',
+        0x3b : '<inventory_root>/system/chassis/motherboard/dimm30',
+        0x3c : '<inventory_root>/system/chassis/motherboard/dimm29',
+        0x3d : '<inventory_root>/system/chassis/motherboard/dimm28',
+        0x3e : '<inventory_root>/system/chassis/motherboard/cpu0/core0',
+        0x3f : '<inventory_root>/system/chassis/motherboard/cpu0/core1',
+        0x40 : '<inventory_root>/system/chassis/motherboard/cpu0/core2',
+        0x41 : '<inventory_root>/system/chassis/motherboard/cpu0/core3',
+        0x42 : '<inventory_root>/system/chassis/motherboard/cpu0/core4',
+        0x43 : '<inventory_root>/system/chassis/motherboard/cpu0/core5',
+        0x44 : '<inventory_root>/system/chassis/motherboard/cpu0/core6',
+        0x45 : '<inventory_root>/system/chassis/motherboard/cpu0/core7',
+        0x46 : '<inventory_root>/system/chassis/motherboard/cpu0/core8',
+        0x47 : '<inventory_root>/system/chassis/motherboard/cpu0/core9',
+        0x48 : '<inventory_root>/system/chassis/motherboard/cpu0/core10',
+        0x49 : '<inventory_root>/system/chassis/motherboard/cpu0/core11',
+        0x4a : '<inventory_root>/system/chassis/motherboard/cpu1/core0',
+        0x4b : '<inventory_root>/system/chassis/motherboard/cpu1/core1',
+        0x4c : '<inventory_root>/system/chassis/motherboard/cpu1/core2',
+        0x4d : '<inventory_root>/system/chassis/motherboard/cpu1/core3',
+        0x4e : '<inventory_root>/system/chassis/motherboard/cpu1/core4',
+        0x4f : '<inventory_root>/system/chassis/motherboard/cpu1/core5',
+        0x50 : '<inventory_root>/system/chassis/motherboard/cpu1/core6',
+        0x51 : '<inventory_root>/system/chassis/motherboard/cpu1/core7',
+        0x52 : '<inventory_root>/system/chassis/motherboard/cpu1/core8',
+        0x53 : '<inventory_root>/system/chassis/motherboard/cpu1/core9',
+        0x54 : '<inventory_root>/system/chassis/motherboard/cpu1/core10',
+        0x55 : '<inventory_root>/system/chassis/motherboard/cpu1/core11',
+        0x56 : '<inventory_root>/system/chassis/motherboard/membuf0',
+        0x57 : '<inventory_root>/system/chassis/motherboard/membuf1',
+        0x58 : '<inventory_root>/system/chassis/motherboard/membuf2',
+        0x59 : '<inventory_root>/system/chassis/motherboard/membuf3',
+        0x5a : '<inventory_root>/system/chassis/motherboard/membuf4',
+        0x5b : '<inventory_root>/system/chassis/motherboard/membuf5',
+        0x5c : '<inventory_root>/system/chassis/motherboard/membuf6',
+        0x5d : '<inventory_root>/system/chassis/motherboard/membuf7',
+        0x5f : '/org/openbmc/sensors/host/BootCount',
+        0x60 : '<inventory_root>/system/chassis/motherboard',
+        0x61 : '<inventory_root>/system/systemevent',
+        0x62 : '<inventory_root>/system/powerlimit',
+        0x63 : '<inventory_root>/system/chassis/motherboard/refclock',
+        0x64 : '<inventory_root>/system/chassis/motherboard/pcieclock',
+        0xb1 : '<inventory_root>/system/chassis/motherboard/todclock',
+        0xb2 : '<inventory_root>/system/chassis/motherboard/apss',
+        0xb3 : '/org/openbmc/sensors/host/powercap',
+        0xb5 : '/org/openbmc/sensors/host/OperatingSystemStatus',
+        0xb6 : '<inventory_root>/system/chassis/motherboard/pcielink',
+    },
+    'GPIO_PRESENT' : {}
+}
+
+GPIO_CONFIG = {}
+GPIO_CONFIG['BMC_POWER_UP'] = \
+        {'gpio_pin': 'D1', 'direction': 'out'}
+GPIO_CONFIG['SYS_PWROK_BUFF'] = \
+        {'gpio_pin': 'D2', 'direction': 'in'}
+GPIO_CONFIG['BMC_WD_CLEAR_PULSE_N'] = \
+        {'gpio_pin': 'N4', 'direction': 'out'}
+GPIO_CONFIG['CM1_OE_R_N'] = \
+        {'gpio_pin': 'Q6', 'direction': 'out'}
+GPIO_CONFIG['BMC_CP0_RESET_N'] = \
+        {'gpio_pin': 'O2', 'direction': 'out'}
+GPIO_CONFIG['BMC_CFAM_RESET_N_R'] = \
+        {'gpio_pin': 'J2', 'direction': 'out'}
+GPIO_CONFIG['PEX8718_DEVICES_RESET_N'] = \
+        {'gpio_pin': 'B6', 'direction': 'out'}
+GPIO_CONFIG['CP0_DEVICES_RESET_N'] = \
+        {'gpio_pin': 'N3', 'direction': 'out'}
+GPIO_CONFIG['CP1_DEVICES_RESET_N'] = \
+        {'gpio_pin': 'N5', 'direction': 'out'}
+
+GPIO_CONFIG['FSI_DATA'] = \
+        {'gpio_pin': 'A5', 'direction': 'out'}
+GPIO_CONFIG['FSI_CLK'] = \
+        {'gpio_pin': 'A4', 'direction': 'out'}
+GPIO_CONFIG['FSI_ENABLE'] = \
+        {'gpio_pin': 'D0', 'direction': 'out'}
+GPIO_CONFIG['CRONUS_SEL'] = \
+        {'gpio_pin': 'A6', 'direction': 'out'}
+GPIO_CONFIG['BMC_THROTTLE'] = \
+        {'gpio_pin': 'J3', 'direction': 'out'}
+
+GPIO_CONFIG['POWER_BUTTON'] = \
+        {'gpio_pin': 'E0', 'direction': 'both'}
+GPIO_CONFIG['RESET_BUTTON'] = \
+        {'gpio_pin': 'E4', 'direction': 'both'}
+
+GPIO_CONFIG['PS0_PRES_N'] = \
+        {'gpio_pin': 'P7', 'direction': 'in'}
+GPIO_CONFIG['PS1_PRES_N'] = \
+        {'gpio_pin': 'N0', 'direction': 'in'}
+GPIO_CONFIG['CARD_PRES_N'] = \
+        {'gpio_pin': 'J0', 'direction': 'in'}
+
+
+
+
+def convertGpio(name):
+    name = name.upper()
+    c = name[0:1]
+    offset = int(name[1:])
+    a = ord(c)-65
+    base = a*8+GPIO_BASE
+    return base+offset
+
+
+HWMON_CONFIG = {
+    '4-0050' : {
+        'names' : {
+            'caps_curr_powercap' : { 'object_path' : 'powercap/curr_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_curr_powerreading' : { 'object_path' : 'powercap/system_power','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_max_powercap' : { 'object_path' : 'powercap/max_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_min_powercap' : { 'object_path' : 'powercap/min_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_norm_powercap' : { 'object_path' : 'powercap/n_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_user_powerlimit' : { 'object_path' : 'powercap/user_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+        },
+        'labels' : {
+        '176' :  { 'object_path' : 'temperature/cpu0/core0','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '177' :  { 'object_path' : 'temperature/cpu0/core1','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '178' :  { 'object_path' : 'temperature/cpu0/core2','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '179' :  { 'object_path' : 'temperature/cpu0/core3','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '180' :  { 'object_path' : 'temperature/cpu0/core4','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '181' :  { 'object_path' : 'temperature/cpu0/core5','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '182' :  { 'object_path' : 'temperature/cpu0/core6','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '183' :  { 'object_path' : 'temperature/cpu0/core7','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '184' :  { 'object_path' : 'temperature/cpu0/core8','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '185' :  { 'object_path' : 'temperature/cpu0/core9','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '186' :  { 'object_path' : 'temperature/cpu0/core10','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '187' :  { 'object_path' : 'temperature/cpu0/core11','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '102' :  { 'object_path' : 'temperature/dimm0','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '103' :  { 'object_path' : 'temperature/dimm1','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '104' :  { 'object_path' : 'temperature/dimm2','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '105' :  { 'object_path' : 'temperature/dimm3','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '106' :  { 'object_path' : 'temperature/dimm4','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '107' :  { 'object_path' : 'temperature/dimm5','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '108' :  { 'object_path' : 'temperature/dimm6','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '109' :  { 'object_path' : 'temperature/dimm7','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '110' :  { 'object_path' : 'temperature/dimm8','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '111' :  { 'object_path' : 'temperature/dimm9','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '112' :  { 'object_path' : 'temperature/dimm10','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '113' :  { 'object_path' : 'temperature/dimm11','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '114' :  { 'object_path' : 'temperature/dimm12','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '115' :  { 'object_path' : 'temperature/dimm13','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '116' :  { 'object_path' : 'temperature/dimm14','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '117' :  { 'object_path' : 'temperature/dimm15','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '94' :  { 'object_path' : 'temperature/membuf0','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '95' :  { 'object_path' : 'temperature/membuf1','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '96' :  { 'object_path' : 'temperature/membuf2','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '97' :  { 'object_path' : 'temperature/membuf3','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        }
+    },
+    '5-0050' : {
+        'labels' :  {
+        '188' :  { 'object_path' : 'temperature/cpu1/core0','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '189' :  { 'object_path' : 'temperature/cpu1/core1','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '190' :  { 'object_path' : 'temperature/cpu1/core2','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '191' :  { 'object_path' : 'temperature/cpu1/core3','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '192' :  { 'object_path' : 'temperature/cpu1/core4','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '193' :  { 'object_path' : 'temperature/cpu1/core5','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '194' :  { 'object_path' : 'temperature/cpu1/core6','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '195' :  { 'object_path' : 'temperature/cpu1/core7','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '196' :  { 'object_path' : 'temperature/cpu1/core8','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '197' :  { 'object_path' : 'temperature/cpu1/core9','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '198' :  { 'object_path' : 'temperature/cpu1/core10','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '199' :  { 'object_path' : 'temperature/cpu1/core11','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '118' :  { 'object_path' : 'temperature/dimm16','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '119' :  { 'object_path' : 'temperature/dimm17','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '120' :  { 'object_path' : 'temperature/dimm18','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '121' :  { 'object_path' : 'temperature/dimm19','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '122' :  { 'object_path' : 'temperature/dimm20','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '123' :  { 'object_path' : 'temperature/dimm21','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '124' :  { 'object_path' : 'temperature/dimm22','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '125' :  { 'object_path' : 'temperature/dimm23','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '126' :  { 'object_path' : 'temperature/dimm24','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '127' :  { 'object_path' : 'temperature/dimm25','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '128' :  { 'object_path' : 'temperature/dimm26','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '129' :  { 'object_path' : 'temperature/dimm27','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '130' :  { 'object_path' : 'temperature/dimm28','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '131' :  { 'object_path' : 'temperature/dimm29','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '132' :  { 'object_path' : 'temperature/dimm30','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '133' :  { 'object_path' : 'temperature/dimm31','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '98' :  { 'object_path' : 'temperature/membuf4','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '99' :  { 'object_path' : 'temperature/membuf5','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '100' :  { 'object_path' : 'temperature/membuf6','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '101' :  { 'object_path' : 'temperature/membuf7','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        }
+    },
+}
diff --git a/bin/Garrison.py b/bin/Garrison.py
new file mode 100755
index 0000000..5564162
--- /dev/null
+++ b/bin/Garrison.py
@@ -0,0 +1,610 @@
+#! /usr/bin/python
+
+HOME_PATH = './'
+CACHE_PATH = '/var/cache/obmc/'
+FLASH_DOWNLOAD_PATH = "/tmp"
+GPIO_BASE = 320
+SYSTEM_NAME = "Garrison"
+
+
+## System states
+##   state can change to next state in 2 ways:
+##   - a process emits a GotoSystemState signal with state name to goto
+##   - objects specified in EXIT_STATE_DEPEND have started
+SYSTEM_STATES = [
+    'BASE_APPS',
+    'BMC_STARTING',
+    'BMC_READY',
+    'HOST_POWERING_ON',
+    'HOST_POWERED_ON',
+    'HOST_BOOTING',
+    'HOST_BOOTED',
+    'HOST_POWERED_OFF',
+]
+
+EXIT_STATE_DEPEND = {
+    'BASE_APPS' : {
+        '/org/openbmc/sensors': 0,
+    },
+    'BMC_STARTING' : {
+        '/org/openbmc/control/chassis0': 0,
+        '/org/openbmc/control/power0' : 0,
+        '/org/openbmc/control/host0' : 0,
+        '/org/openbmc/control/flash/bios' : 0,
+    },
+}
+
+## method will be called when state is entered
+ENTER_STATE_CALLBACK = {
+    'HOST_POWERED_ON' : {
+        'boot' : {
+            'bus_name'    : 'org.openbmc.control.Host',
+            'obj_name'    : '/org/openbmc/control/host0',
+            'interface_name' : 'org.openbmc.control.Host',
+        },
+    },
+    'HOST_POWERED_OFF' : {
+        'setOff' : {
+            'bus_name'   : 'org.openbmc.control.led',
+            'obj_name'   : '/org/openbmc/control/led/identify',
+            'interface_name' : 'org.openbmc.Led',
+        }
+    },
+    'BMC_READY' : {
+        'setOn' : {
+            'bus_name'   : 'org.openbmc.control.led',
+            'obj_name'   : '/org/openbmc/control/led/beep',
+            'interface_name' : 'org.openbmc.Led',
+        },
+        'init' : {
+            'bus_name'   : 'org.openbmc.control.Flash',
+            'obj_name'   : '/org/openbmc/control/flash/bios',
+            'interface_name' : 'org.openbmc.Flash',
+        }
+    }
+}
+
+APPS = {
+    'startup_hacks' : {
+        'system_state'    : 'BASE_APPS',
+        'start_process'   : True,
+        'monitor_process' : False,
+        'process_name'    : 'startup_hacks.sh',
+    },
+    'inventory' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'inventory_items.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'hwmon' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'hwmon.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'sensor_manager' : {
+        'system_state'    : 'BASE_APPS',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'sensor_manager2.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'host_watchdog' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'host_watchdog.exe',
+    },
+    'power_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name' : 'power_control.exe',
+        'args' : [ '3000', '10' ]
+    },
+    'power_button' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'button_power.exe',
+    },
+    'reset_button' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'button_reset.exe',
+    },
+    'led_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'led_controller.exe',
+    },
+    'flash_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'flash_bios.exe',
+    },
+    'bmc_flash_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'bmc_update.py',
+    },
+    'download_manager' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'download_manager.py',
+        'args'            : [ SYSTEM_NAME ]
+    },
+    'host_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'control_host.exe',
+    },
+    'chassis_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'chassis_control.py',
+    },
+    'restore' : {
+        'system_state'    : 'BMC_READY',
+        'start_process'   : True,
+        'monitor_process' : False,
+        'process_name'    : 'discover_system_state.py',
+    },
+    'bmc_control' : {
+        'system_state'    : 'BMC_STARTING',
+        'start_process'   : True,
+        'monitor_process' : True,
+        'process_name'    : 'control_bmc.exe',
+    },
+}
+
+CACHED_INTERFACES = {
+        "org.openbmc.InventoryItem" : True,
+        "org.openbmc.control.Chassis" : True,
+}
+
+INVENTORY_ROOT = '/org/openbmc/inventory'
+
+FRU_INSTANCES = {
+    '<inventory_root>/system' : { 'fru_type' : 'SYSTEM','is_fru' : True, 'present' : "True" },
+    '<inventory_root>/system/bios' : { 'fru_type' : 'SYSTEM','is_fru' : True, 'present' : "True" },
+    '<inventory_root>/system/misc' : { 'fru_type' : 'SYSTEM','is_fru' : False, },
+
+    '<inventory_root>/system/chassis' : { 'fru_type' : 'SYSTEM','is_fru' : True, 'present' : "True" },
+
+    '<inventory_root>/system/chassis/motherboard' : { 'fru_type' : 'MAIN_PLANAR','is_fru' : True, },
+
+    '<inventory_root>/system/systemevent'                  : { 'fru_type' : 'SYSTEM_EVENT', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/refclock' : { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/pcieclock': { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/todclock' : { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/apss'     : { 'fru_type' : 'MAIN_PLANAR', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/fan0' : { 'fru_type' : 'FAN','is_fru' : True, },
+    '<inventory_root>/system/chassis/fan1' : { 'fru_type' : 'FAN','is_fru' : True, },
+    '<inventory_root>/system/chassis/fan2' : { 'fru_type' : 'FAN','is_fru' : True, },
+    '<inventory_root>/system/chassis/fan3' : { 'fru_type' : 'FAN','is_fru' : True, },
+
+    '<inventory_root>/system/chassis/motherboard/bmc' : { 'fru_type' : 'BMC','is_fru' : False, 'manufacturer' : 'ASPEED' },
+
+    '<inventory_root>/system/chassis/motherboard/cpu0' : { 'fru_type' : 'CPU', 'is_fru' : True, },
+    '<inventory_root>/system/chassis/motherboard/cpu1' : { 'fru_type' : 'CPU', 'is_fru' : True, },
+
+    '<inventory_root>/system/chassis/motherboard/cpu0/core0' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core1' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core2' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core3' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core4' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core5' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core6' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core7' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core8' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core9' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core10': { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu0/core11': { 'fru_type' : 'CORE', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/motherboard/cpu1/core0' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core1' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core2' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core3' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core4' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core5' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core6' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core7' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core8' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core9' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core10' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/cpu1/core11' : { 'fru_type' : 'CORE', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/motherboard/membuf0' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf1' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf2' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf3' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf4' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf5' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf6' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+    '<inventory_root>/system/chassis/motherboard/membuf7' : { 'fru_type' : 'MEMORY_BUFFER', 'is_fru' : False, },
+
+    '<inventory_root>/system/chassis/motherboard/dimm0' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm1' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm2' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm3' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm4' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm5' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm6' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm7' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm8' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm9' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm10' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm11' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm12' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm13' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm14' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm15' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm16' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm17' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm18' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm19' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm20' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm21' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm22' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm23' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm24' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm25' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm26' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm27' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm28' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm29' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm30' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+    '<inventory_root>/system/chassis/motherboard/dimm31' : { 'fru_type' : 'DIMM', 'is_fru' : True,},
+}
+
+ID_LOOKUP = {
+    'FRU' : {
+        0x01 : '<inventory_root>/system/chassis/motherboard/cpu0',
+        0x02 : '<inventory_root>/system/chassis/motherboard/cpu1',
+        0x03 : '<inventory_root>/system/chassis/motherboard',
+        0x04 : '<inventory_root>/system/chassis/motherboard/membuf0',
+        0x05 : '<inventory_root>/system/chassis/motherboard/membuf1',
+        0x06 : '<inventory_root>/system/chassis/motherboard/membuf2',
+        0x07 : '<inventory_root>/system/chassis/motherboard/membuf3',
+        0x08 : '<inventory_root>/system/chassis/motherboard/membuf4',
+        0x09 : '<inventory_root>/system/chassis/motherboard/membuf5',
+        0x0c : '<inventory_root>/system/chassis/motherboard/dimm0',
+        0x0d : '<inventory_root>/system/chassis/motherboard/dimm1',
+        0x0e : '<inventory_root>/system/chassis/motherboard/dimm2',
+        0x0f : '<inventory_root>/system/chassis/motherboard/dimm3',
+        0x10 : '<inventory_root>/system/chassis/motherboard/dimm4',
+        0x11 : '<inventory_root>/system/chassis/motherboard/dimm5',
+        0x12 : '<inventory_root>/system/chassis/motherboard/dimm6',
+        0x13 : '<inventory_root>/system/chassis/motherboard/dimm7',
+        0x14 : '<inventory_root>/system/chassis/motherboard/dimm8',
+        0x15 : '<inventory_root>/system/chassis/motherboard/dimm9',
+        0x16 : '<inventory_root>/system/chassis/motherboard/dimm10',
+        0x17 : '<inventory_root>/system/chassis/motherboard/dimm11',
+        0x18 : '<inventory_root>/system/chassis/motherboard/dimm12',
+        0x19 : '<inventory_root>/system/chassis/motherboard/dimm13',
+        0x1a : '<inventory_root>/system/chassis/motherboard/dimm14',
+        0x1b : '<inventory_root>/system/chassis/motherboard/dimm15',
+        0x1c : '<inventory_root>/system/chassis/motherboard/dimm16',
+        0x1d : '<inventory_root>/system/chassis/motherboard/dimm17',
+        0x1e : '<inventory_root>/system/chassis/motherboard/dimm18',
+        0x1f : '<inventory_root>/system/chassis/motherboard/dimm19',
+        0x20 : '<inventory_root>/system/chassis/motherboard/dimm20',
+        0x21 : '<inventory_root>/system/chassis/motherboard/dimm21',
+        0x22 : '<inventory_root>/system/chassis/motherboard/dimm22',
+        0x23 : '<inventory_root>/system/chassis/motherboard/dimm23',
+        0x24 : '<inventory_root>/system/chassis/motherboard/dimm24',
+        0x25 : '<inventory_root>/system/chassis/motherboard/dimm25',
+        0x26 : '<inventory_root>/system/chassis/motherboard/dimm26',
+        0x27 : '<inventory_root>/system/chassis/motherboard/dimm27',
+        0x28 : '<inventory_root>/system/chassis/motherboard/dimm28',
+        0x29 : '<inventory_root>/system/chassis/motherboard/dimm29',
+        0x2a : '<inventory_root>/system/chassis/motherboard/dimm30',
+        0x2b : '<inventory_root>/system/chassis/motherboard/dimm31',
+    },
+    'FRU_STR' : {
+        'PRODUCT_0'  : '<inventory_root>/system/bios',
+        'BOARD_1'    : '<inventory_root>/system/chassis/motherboard/cpu0',
+        'BOARD_2'    : '<inventory_root>/system/chassis/motherboard/cpu1',
+        'CHASSIS_3'  : '<inventory_root>/system/chassis/motherboard',
+        'BOARD_3'    : '<inventory_root>/system/misc',
+        'BOARD_4'    : '<inventory_root>/system/chassis/motherboard/membuf0',
+        'BOARD_5'    : '<inventory_root>/system/chassis/motherboard/membuf1',
+        'BOARD_6'    : '<inventory_root>/system/chassis/motherboard/membuf2',
+        'BOARD_7'    : '<inventory_root>/system/chassis/motherboard/membuf3',
+        'BOARD_8'    : '<inventory_root>/system/chassis/motherboard/membuf4',
+        'BOARD_9'    : '<inventory_root>/system/chassis/motherboard/membuf5',
+        'BOARD_10'   : '<inventory_root>/system/chassis/motherboard/membuf6',
+        'BOARD_11'   : '<inventory_root>/system/chassis/motherboard/membuf7',
+        'PRODUCT_12'   : '<inventory_root>/system/chassis/motherboard/dimm0',
+        'PRODUCT_13'   : '<inventory_root>/system/chassis/motherboard/dimm1',
+        'PRODUCT_14'   : '<inventory_root>/system/chassis/motherboard/dimm2',
+        'PRODUCT_15'   : '<inventory_root>/system/chassis/motherboard/dimm3',
+        'PRODUCT_16'   : '<inventory_root>/system/chassis/motherboard/dimm4',
+        'PRODUCT_17'   : '<inventory_root>/system/chassis/motherboard/dimm5',
+        'PRODUCT_18'   : '<inventory_root>/system/chassis/motherboard/dimm6',
+        'PRODUCT_19'   : '<inventory_root>/system/chassis/motherboard/dimm7',
+        'PRODUCT_20'   : '<inventory_root>/system/chassis/motherboard/dimm8',
+        'PRODUCT_21'   : '<inventory_root>/system/chassis/motherboard/dimm9',
+        'PRODUCT_22'   : '<inventory_root>/system/chassis/motherboard/dimm10',
+        'PRODUCT_23'   : '<inventory_root>/system/chassis/motherboard/dimm11',
+        'PRODUCT_24'   : '<inventory_root>/system/chassis/motherboard/dimm12',
+        'PRODUCT_25'   : '<inventory_root>/system/chassis/motherboard/dimm13',
+        'PRODUCT_26'   : '<inventory_root>/system/chassis/motherboard/dimm14',
+        'PRODUCT_27'   : '<inventory_root>/system/chassis/motherboard/dimm15',
+        'PRODUCT_28'   : '<inventory_root>/system/chassis/motherboard/dimm16',
+        'PRODUCT_29'   : '<inventory_root>/system/chassis/motherboard/dimm17',
+        'PRODUCT_30'   : '<inventory_root>/system/chassis/motherboard/dimm18',
+        'PRODUCT_31'   : '<inventory_root>/system/chassis/motherboard/dimm19',
+        'PRODUCT_32'   : '<inventory_root>/system/chassis/motherboard/dimm20',
+        'PRODUCT_33'   : '<inventory_root>/system/chassis/motherboard/dimm21',
+        'PRODUCT_34'   : '<inventory_root>/system/chassis/motherboard/dimm22',
+        'PRODUCT_35'   : '<inventory_root>/system/chassis/motherboard/dimm23',
+        'PRODUCT_36'   : '<inventory_root>/system/chassis/motherboard/dimm24',
+        'PRODUCT_37'   : '<inventory_root>/system/chassis/motherboard/dimm25',
+        'PRODUCT_38'   : '<inventory_root>/system/chassis/motherboard/dimm26',
+        'PRODUCT_39'   : '<inventory_root>/system/chassis/motherboard/dimm27',
+        'PRODUCT_40'   : '<inventory_root>/system/chassis/motherboard/dimm28',
+        'PRODUCT_41'   : '<inventory_root>/system/chassis/motherboard/dimm29',
+        'PRODUCT_42'   : '<inventory_root>/system/chassis/motherboard/dimm30',
+        'PRODUCT_43'   : '<inventory_root>/system/chassis/motherboard/dimm31',
+        'PRODUCT_47'   : '<inventory_root>/system/misc',
+    },
+    'SENSOR' : {
+        0x04 : '/org/openbmc/sensors/host/HostStatus',
+        0x05 : '/org/openbmc/sensors/host/BootProgress',
+        0x08 : '/org/openbmc/sensors/host/cpu0/OccStatus',
+        0x09 : '/org/openbmc/sensors/host/cpu1/OccStatus',
+        0x0c : '<inventory_root>/system/chassis/motherboard/cpu0',
+        0x0e : '<inventory_root>/system/chassis/motherboard/cpu1',
+        0x1e : '<inventory_root>/system/chassis/motherboard/dimm3',
+        0x1f : '<inventory_root>/system/chassis/motherboard/dimm2',
+        0x20 : '<inventory_root>/system/chassis/motherboard/dimm1',
+        0x21 : '<inventory_root>/system/chassis/motherboard/dimm0',
+        0x22 : '<inventory_root>/system/chassis/motherboard/dimm7',
+        0x23 : '<inventory_root>/system/chassis/motherboard/dimm6',
+        0x24 : '<inventory_root>/system/chassis/motherboard/dimm5',
+        0x25 : '<inventory_root>/system/chassis/motherboard/dimm4',
+        0x26 : '<inventory_root>/system/chassis/motherboard/dimm11',
+        0x27 : '<inventory_root>/system/chassis/motherboard/dimm10',
+        0x28 : '<inventory_root>/system/chassis/motherboard/dimm9',
+        0x29 : '<inventory_root>/system/chassis/motherboard/dimm8',
+        0x2a : '<inventory_root>/system/chassis/motherboard/dimm15',
+        0x2b : '<inventory_root>/system/chassis/motherboard/dimm14',
+        0x2c : '<inventory_root>/system/chassis/motherboard/dimm13',
+        0x2d : '<inventory_root>/system/chassis/motherboard/dimm12',
+        0x2e : '<inventory_root>/system/chassis/motherboard/dimm19',
+        0x2f : '<inventory_root>/system/chassis/motherboard/dimm18',
+        0x30 : '<inventory_root>/system/chassis/motherboard/dimm17',
+        0x31 : '<inventory_root>/system/chassis/motherboard/dimm16',
+        0x32 : '<inventory_root>/system/chassis/motherboard/dimm23',
+        0x33 : '<inventory_root>/system/chassis/motherboard/dimm22',
+        0x34 : '<inventory_root>/system/chassis/motherboard/dimm21',
+        0x35 : '<inventory_root>/system/chassis/motherboard/dimm20',
+        0x36 : '<inventory_root>/system/chassis/motherboard/dimm27',
+        0x37 : '<inventory_root>/system/chassis/motherboard/dimm26',
+        0x38 : '<inventory_root>/system/chassis/motherboard/dimm25',
+        0x39 : '<inventory_root>/system/chassis/motherboard/dimm24',
+        0x3a : '<inventory_root>/system/chassis/motherboard/dimm31',
+        0x3b : '<inventory_root>/system/chassis/motherboard/dimm30',
+        0x3c : '<inventory_root>/system/chassis/motherboard/dimm29',
+        0x3d : '<inventory_root>/system/chassis/motherboard/dimm28',
+        0x3e : '<inventory_root>/system/chassis/motherboard/cpu0/core0',
+        0x3f : '<inventory_root>/system/chassis/motherboard/cpu0/core1',
+        0x40 : '<inventory_root>/system/chassis/motherboard/cpu0/core2',
+        0x41 : '<inventory_root>/system/chassis/motherboard/cpu0/core3',
+        0x42 : '<inventory_root>/system/chassis/motherboard/cpu0/core4',
+        0x43 : '<inventory_root>/system/chassis/motherboard/cpu0/core5',
+        0x44 : '<inventory_root>/system/chassis/motherboard/cpu0/core6',
+        0x45 : '<inventory_root>/system/chassis/motherboard/cpu0/core7',
+        0x46 : '<inventory_root>/system/chassis/motherboard/cpu0/core8',
+        0x47 : '<inventory_root>/system/chassis/motherboard/cpu0/core9',
+        0x48 : '<inventory_root>/system/chassis/motherboard/cpu0/core10',
+        0x49 : '<inventory_root>/system/chassis/motherboard/cpu0/core11',
+        0x4a : '<inventory_root>/system/chassis/motherboard/cpu1/core0',
+        0x4b : '<inventory_root>/system/chassis/motherboard/cpu1/core1',
+        0x4c : '<inventory_root>/system/chassis/motherboard/cpu1/core2',
+        0x4d : '<inventory_root>/system/chassis/motherboard/cpu1/core3',
+        0x4e : '<inventory_root>/system/chassis/motherboard/cpu1/core4',
+        0x4f : '<inventory_root>/system/chassis/motherboard/cpu1/core5',
+        0x50 : '<inventory_root>/system/chassis/motherboard/cpu1/core6',
+        0x51 : '<inventory_root>/system/chassis/motherboard/cpu1/core7',
+        0x52 : '<inventory_root>/system/chassis/motherboard/cpu1/core8',
+        0x53 : '<inventory_root>/system/chassis/motherboard/cpu1/core9',
+        0x54 : '<inventory_root>/system/chassis/motherboard/cpu1/core10',
+        0x55 : '<inventory_root>/system/chassis/motherboard/cpu1/core11',
+        0x56 : '<inventory_root>/system/chassis/motherboard/membuf0',
+        0x57 : '<inventory_root>/system/chassis/motherboard/membuf1',
+        0x58 : '<inventory_root>/system/chassis/motherboard/membuf2',
+        0x59 : '<inventory_root>/system/chassis/motherboard/membuf3',
+        0x5a : '<inventory_root>/system/chassis/motherboard/membuf4',
+        0x5b : '<inventory_root>/system/chassis/motherboard/membuf5',
+        0x5c : '<inventory_root>/system/chassis/motherboard/membuf6',
+        0x5d : '<inventory_root>/system/chassis/motherboard/membuf7',
+        0x5f : '/org/openbmc/sensors/host/BootCount',
+        0x60 : '<inventory_root>/system/chassis/motherboard',
+        0x61 : '<inventory_root>/system/systemevent',
+        0x62 : '<inventory_root>/system/powerlimit',
+        0x63 : '<inventory_root>/system/chassis/motherboard/refclock',
+        0x64 : '<inventory_root>/system/chassis/motherboard/pcieclock',
+        0xb1 : '<inventory_root>/system/chassis/motherboard/todclock',
+        0xb2 : '<inventory_root>/system/chassis/motherboard/apss',
+        0xb3 : '/org/openbmc/sensors/host/powercap',
+        0xb5 : '/org/openbmc/sensors/host/OperatingSystemStatus',
+        0xb6 : '<inventory_root>/system/chassis/motherboard/pcielink',
+    },
+    'GPIO_PRESENT' : {}
+}
+
+GPIO_CONFIG = {}
+GPIO_CONFIG['BMC_POWER_UP'] = \
+        {'gpio_pin': 'D1', 'direction': 'out'}
+GPIO_CONFIG['SYS_PWROK_BUFF'] = \
+        {'gpio_pin': 'D2', 'direction': 'in'}
+GPIO_CONFIG['BMC_WD_CLEAR_PULSE_N'] = \
+        {'gpio_pin': 'N4', 'direction': 'out'}
+GPIO_CONFIG['CM1_OE_R_N'] = \
+        {'gpio_pin': 'Q6', 'direction': 'out'}
+GPIO_CONFIG['BMC_CP0_RESET_N'] = \
+        {'gpio_pin': 'O2', 'direction': 'out'}
+GPIO_CONFIG['BMC_CFAM_RESET_N_R'] = \
+        {'gpio_pin': 'J2', 'direction': 'out'}
+GPIO_CONFIG['PEX8718_DEVICES_RESET_N'] = \
+        {'gpio_pin': 'B6', 'direction': 'out'}
+GPIO_CONFIG['CP0_DEVICES_RESET_N'] = \
+        {'gpio_pin': 'N3', 'direction': 'out'}
+GPIO_CONFIG['CP1_DEVICES_RESET_N'] = \
+        {'gpio_pin': 'N5', 'direction': 'out'}
+
+GPIO_CONFIG['FSI_DATA'] = \
+        {'gpio_pin': 'A5', 'direction': 'out'}
+GPIO_CONFIG['FSI_CLK'] = \
+        {'gpio_pin': 'A4', 'direction': 'out'}
+GPIO_CONFIG['FSI_ENABLE'] = \
+        {'gpio_pin': 'D0', 'direction': 'out'}
+GPIO_CONFIG['CRONUS_SEL'] = \
+        {'gpio_pin': 'A6', 'direction': 'out'}
+GPIO_CONFIG['BMC_THROTTLE'] = \
+        {'gpio_pin': 'J3', 'direction': 'out'}
+
+GPIO_CONFIG['POWER_BUTTON'] = \
+        {'gpio_pin': 'E0', 'direction': 'both'}
+GPIO_CONFIG['RESET_BUTTON'] = \
+        {'gpio_pin': 'E4', 'direction': 'both'}
+
+GPIO_CONFIG['PS0_PRES_N'] = \
+        {'gpio_pin': 'P7', 'direction': 'in'}
+GPIO_CONFIG['PS1_PRES_N'] = \
+        {'gpio_pin': 'N0', 'direction': 'in'}
+GPIO_CONFIG['CARD_PRES_N'] = \
+        {'gpio_pin': 'J0', 'direction': 'in'}
+
+
+
+
+def convertGpio(name):
+    name = name.upper()
+    c = name[0:1]
+    offset = int(name[1:])
+    a = ord(c)-65
+    base = a*8+GPIO_BASE
+    return base+offset
+
+
+HWMON_CONFIG = {
+    '4-0050' : {
+        'names' : {
+            'caps_curr_powercap' : { 'object_path' : 'powercap/curr_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_curr_powerreading' : { 'object_path' : 'powercap/system_power','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_max_powercap' : { 'object_path' : 'powercap/max_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_min_powercap' : { 'object_path' : 'powercap/min_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_norm_powercap' : { 'object_path' : 'powercap/n_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+            'caps_user_powerlimit' : { 'object_path' : 'powercap/user_cap','poll_interval' : 10000,'scale' : 1,'units' : 'W' },
+        },
+        'labels' : {
+        '176' :  { 'object_path' : 'temperature/cpu0/core0','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '177' :  { 'object_path' : 'temperature/cpu0/core1','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '178' :  { 'object_path' : 'temperature/cpu0/core2','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '179' :  { 'object_path' : 'temperature/cpu0/core3','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '180' :  { 'object_path' : 'temperature/cpu0/core4','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '181' :  { 'object_path' : 'temperature/cpu0/core5','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '182' :  { 'object_path' : 'temperature/cpu0/core6','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '183' :  { 'object_path' : 'temperature/cpu0/core7','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '184' :  { 'object_path' : 'temperature/cpu0/core8','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '185' :  { 'object_path' : 'temperature/cpu0/core9','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '186' :  { 'object_path' : 'temperature/cpu0/core10','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '187' :  { 'object_path' : 'temperature/cpu0/core11','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '102' :  { 'object_path' : 'temperature/dimm0','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '103' :  { 'object_path' : 'temperature/dimm1','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '104' :  { 'object_path' : 'temperature/dimm2','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '105' :  { 'object_path' : 'temperature/dimm3','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '106' :  { 'object_path' : 'temperature/dimm4','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '107' :  { 'object_path' : 'temperature/dimm5','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '108' :  { 'object_path' : 'temperature/dimm6','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '109' :  { 'object_path' : 'temperature/dimm7','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '110' :  { 'object_path' : 'temperature/dimm8','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '111' :  { 'object_path' : 'temperature/dimm9','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '112' :  { 'object_path' : 'temperature/dimm10','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '113' :  { 'object_path' : 'temperature/dimm11','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '114' :  { 'object_path' : 'temperature/dimm12','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '115' :  { 'object_path' : 'temperature/dimm13','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '116' :  { 'object_path' : 'temperature/dimm14','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '117' :  { 'object_path' : 'temperature/dimm15','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '94' :  { 'object_path' : 'temperature/membuf0','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '95' :  { 'object_path' : 'temperature/membuf1','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '96' :  { 'object_path' : 'temperature/membuf2','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '97' :  { 'object_path' : 'temperature/membuf3','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        }
+    },
+    '5-0050' : {
+        'labels' :  {
+        '188' :  { 'object_path' : 'temperature/cpu1/core0','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '189' :  { 'object_path' : 'temperature/cpu1/core1','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '190' :  { 'object_path' : 'temperature/cpu1/core2','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '191' :  { 'object_path' : 'temperature/cpu1/core3','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '192' :  { 'object_path' : 'temperature/cpu1/core4','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '193' :  { 'object_path' : 'temperature/cpu1/core5','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '194' :  { 'object_path' : 'temperature/cpu1/core6','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '195' :  { 'object_path' : 'temperature/cpu1/core7','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '196' :  { 'object_path' : 'temperature/cpu1/core8','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '197' :  { 'object_path' : 'temperature/cpu1/core9','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '198' :  { 'object_path' : 'temperature/cpu1/core10','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '199' :  { 'object_path' : 'temperature/cpu1/core11','poll_interval' : 5000,'scale' : 1000,'units' : 'C',
+            'critical_upper' : 100, 'critical_lower' : -100, 'warning_upper' : 90, 'warning_lower' : -99, 'emergency_enabled' : True },
+        '118' :  { 'object_path' : 'temperature/dimm16','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '119' :  { 'object_path' : 'temperature/dimm17','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '120' :  { 'object_path' : 'temperature/dimm18','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '121' :  { 'object_path' : 'temperature/dimm19','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '122' :  { 'object_path' : 'temperature/dimm20','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '123' :  { 'object_path' : 'temperature/dimm21','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '124' :  { 'object_path' : 'temperature/dimm22','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '125' :  { 'object_path' : 'temperature/dimm23','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '126' :  { 'object_path' : 'temperature/dimm24','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '127' :  { 'object_path' : 'temperature/dimm25','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '128' :  { 'object_path' : 'temperature/dimm26','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '129' :  { 'object_path' : 'temperature/dimm27','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '130' :  { 'object_path' : 'temperature/dimm28','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '131' :  { 'object_path' : 'temperature/dimm29','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '132' :  { 'object_path' : 'temperature/dimm30','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '133' :  { 'object_path' : 'temperature/dimm31','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '98' :  { 'object_path' : 'temperature/membuf4','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '99' :  { 'object_path' : 'temperature/membuf5','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '100' :  { 'object_path' : 'temperature/membuf6','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        '101' :  { 'object_path' : 'temperature/membuf7','poll_interval' : 5000,'scale' : 1000,'units' : 'C' },
+        }
+    },
+}
diff --git a/bin/Palmetto.py b/bin/Palmetto.py
index 7172364..09fbe06 100755
--- a/bin/Palmetto.py
+++ b/bin/Palmetto.py
@@ -142,13 +142,6 @@
 		'monitor_process' : True,
 		'process_name'    : 'chassis_control.py',
 	},
-	'fans' : {
-		'system_state'    : 'BMC_STARTING',
-		'start_process'   : True,
-		'monitor_process' : True,
-		'process_name'    : 'fan.exe',
-		'args'            : [ 'fan0','fan1','fan2','fan3','fan4' ]
-	},
 	'bmc_control' : {
 		'system_state'    : 'BMC_STARTING',
 		'start_process'   : True,
diff --git a/bin/inventory_items.py b/bin/inventory_items.py
index 6320f90..e0351a8 100755
--- a/bin/inventory_items.py
+++ b/bin/inventory_items.py
@@ -71,7 +71,7 @@
 		for line in f:
 			p = line.rstrip('\n')
 			parts = line.rstrip('\n').split('=')
-			if (parts[0] == "BUILD_ID"):
+			if (parts[0] == "VERSION_ID"):
 				version = parts[1]
 	return version
 
@@ -79,7 +79,6 @@
 if __name__ == '__main__':
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
     bus = Openbmc.getDBus()
-    name = dbus.service.BusName(DBUS_NAME,bus)
     mainloop = gobject.MainLoop()
     obj_parent = Inventory(bus, '/org/openbmc/inventory')
 
@@ -94,6 +93,7 @@
 		version = getVersion()
 		obj.update({'version': version})
 
+    name = dbus.service.BusName(DBUS_NAME,bus)
     print "Running Inventory Manager"
     mainloop.run()
 
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 004d978..e74788a 100755
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -34,7 +34,7 @@
 		dbus.service.Object.__init__(self,bus,obj_name)
 
 		bus.add_signal_receiver(self.NewObjectHandler,
-			signal_name = "ObjectAdded", sender_keyword = 'bus_name')
+			signal_name = "InterfacesAdded", sender_keyword = 'bus_name')
 		bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
 
 		self.Set(DBUS_NAME,"current_state","")
@@ -173,7 +173,7 @@
 	
 		return True
 
-	def NewObjectHandler(self,obj_path, interface_name, bus_name = None):
+	def NewObjectHandler(self, obj_path, iprops, bus_name = None):
 		current_state = self.Get(DBUS_NAME,"current_state")
 		if (self.bus_name_lookup.has_key(obj_path)):
 			if (self.bus_name_lookup[obj_path] == bus_name):
diff --git a/includes/object_mapper.c b/includes/object_mapper.c
deleted file mode 100644
index 1164251..0000000
--- a/includes/object_mapper.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "object_mapper.h"
-
-
-void
-emit_object_added(GDBusObjectManager *manager)
-{
-    GList *objects;
-    GList *l;
-
-    objects = g_dbus_object_manager_get_objects(manager);
-    for (l = objects; l != NULL; l = l->next)
-    {
-        GDBusObject *object = l->data;
-	ObjectMapper* map = object_get_object_mapper((Object*)object);
-
-        GList *interfaces;
-        GList *ll;
-	const gchar *object_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object));
-
-        interfaces = g_dbus_object_get_interfaces(G_DBUS_OBJECT(object));
-        for (ll = interfaces; ll != NULL; ll = ll->next)
-        {
-            GDBusInterface *interface = G_DBUS_INTERFACE(ll->data);
-            object_mapper_emit_object_added(map,object_path,
-		g_dbus_interface_get_info(interface)->name);
-        }
-        g_list_free_full(interfaces, g_object_unref);
-    }
-    g_list_free_full(objects, g_object_unref);
-}
-
diff --git a/includes/object_mapper.h b/includes/object_mapper.h
deleted file mode 100644
index b0a97a7..0000000
--- a/includes/object_mapper.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __OBJECTMAPPER2_H__
-#define __OBJECTMAPPER2_H__
-
-#include "interfaces/openbmc_intf.h"
-
-
-void emit_object_added(GDBusObjectManager*);
-
-
-#endif
diff --git a/includes/openbmc.h b/includes/openbmc.h
index a6d420b..c1c0335 100644
--- a/includes/openbmc.h
+++ b/includes/openbmc.h
@@ -20,7 +20,7 @@
 #ifdef __arm__
 static inline void devmem(void* addr, uint32_t val)
 {
-	printf("devmem 0x%08x = 0x%08x\n",addr,val);
+	printf("devmem %p = 0x%08x\n",addr,val);
         asm volatile("" : : : "memory");
         *(volatile uint32_t *)addr = val;
 }
diff --git a/objects/board_vpd_obj.c b/objects/board_vpd_obj.c
index 217148b..b6c2119 100644
--- a/objects/board_vpd_obj.c
+++ b/objects/board_vpd_obj.c
@@ -1,60 +1,59 @@
-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-

-

-/* ---------------------------------------------------------------------------------------------------- */

-

-gint

-main (gint argc, gchar *argv[])

-{

-	GMainLoop *loop;

-	GDBusConnection *c;

-	GDBusProxy *p;

- 	GError *error;

-	GVariant *parm;

-	GVariant *result;

-

-	loop = g_main_loop_new (NULL, FALSE);

-

-	error = NULL;

-	c = g_bus_get_sync (DBUS_TYPE, NULL, &error);

-

-	error = NULL;

-	p = g_dbus_proxy_new_sync (c,

-                             G_DBUS_PROXY_FLAGS_NONE,

-                             NULL,                      /* GDBusInterfaceInfo* */

-                             "org.openbmc.managers.Inventory", /* name */

-                             "/org/openbmc/inventory/items/system/io_board", /* object path */

-                             "org.openbmc.InventoryItem",        /* interface name */

-                             NULL,                      /* GCancellable */

-                             &error);

-	g_assert_no_error (error);

-

-	//TODO:  Read actual vpd

-	g_print("Reading VPD\n");

-	GVariantBuilder *b;

-	GVariant *dict;

-

-	b = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));

-	g_variant_builder_add (b, "{sv}", "manufacturer", g_variant_new_string ("ibm"));

-	g_variant_builder_add (b, "{sv}", "part_num", g_variant_new_string("3N0001"));

-	dict = g_variant_builder_end (b);

-

-	//proxy_call wants parm as an array

-	parm = g_variant_new("(v)",dict);

-

-	error = NULL;

-	result = g_dbus_proxy_call_sync (p,

-                                   "update",

-				   parm,

-                                   G_DBUS_CALL_FLAGS_NONE,

-                                   -1,

-                                   NULL,

-                                   &error);

-	g_assert_no_error (error);

-	

-	g_object_unref(p);

-	g_object_unref(c);

- 	g_main_loop_unref (loop);

- 	return 0;

-}

+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+
+
+/* ------------------------------------------------------------------------- */
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	GDBusConnection *c;
+	GDBusProxy *p;
+	GError *error;
+	GVariant *parm;
+
+	loop = g_main_loop_new(NULL, FALSE);
+
+	error = NULL;
+	c = g_bus_get_sync(DBUS_TYPE, NULL, &error);
+
+	error = NULL;
+	p = g_dbus_proxy_new_sync(c,
+			G_DBUS_PROXY_FLAGS_NONE,
+			NULL, /* GDBusInterfaceInfo* */
+			"org.openbmc.managers.Inventory", /* name */
+			"/org/openbmc/inventory/items/system/io_board", /* object path */
+			"org.openbmc.InventoryItem", /* interface name */
+			NULL, /* GCancellable */
+			&error);
+	g_assert_no_error(error);
+
+	//TODO: Read actual vpd
+	g_print("Reading VPD\n");
+	GVariantBuilder *b;
+	GVariant *dict;
+
+	b = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+	g_variant_builder_add(b, "{sv}", "manufacturer", g_variant_new_string("ibm"));
+	g_variant_builder_add(b, "{sv}", "part_num", g_variant_new_string("3N0001"));
+	dict = g_variant_builder_end(b);
+
+	//proxy_call wants parm as an array
+	parm = g_variant_new("(v)",dict);
+
+	error = NULL;
+	g_dbus_proxy_call_sync(p,
+			"update",
+			parm,
+			G_DBUS_CALL_FLAGS_NONE,
+			-1,
+			NULL,
+			&error);
+	g_assert_no_error(error);
+
+	g_object_unref(p);
+	g_object_unref(c);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/button_power_obj.c b/objects/button_power_obj.c
index 94f8922..e093a00 100644
--- a/objects/button_power_obj.c
+++ b/objects/button_power_obj.c
@@ -1,178 +1,167 @@
-#include <stdio.h>

-#include "interfaces/openbmc_intf.h"

-#include "gpio.h"

-#include "openbmc.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/buttons";

-static const gchar* instance_name = "power0";

-static const gchar* dbus_name        = "org.openbmc.buttons.Power";

-static const int LONG_PRESS_SECONDS = 3;

-static GDBusObjectManagerServer *manager = NULL;

-

-//This object will use these GPIOs

-GPIO gpio_button    = (GPIO){ "POWER_BUTTON" };

-

-static gboolean

-on_is_on       (Button          *btn,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-  gboolean btn_state=button_get_state(btn);

-  button_complete_is_on(btn,invocation,btn_state);

-  return TRUE;

-

-}

-

-static gboolean

-on_button_press       (Button          *btn,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	button_emit_pressed(btn);

-	button_complete_sim_press(btn,invocation);

-	return TRUE;

-}

-static gboolean

-on_button_interrupt( GIOChannel *channel,

-               GIOCondition condition,

-               gpointer user_data )

-{

-

-	GError *error = 0;

-	gsize bytes_read = 0;

-	gchar buf[2]; 

-	buf[1] = '\0';

-	g_io_channel_seek_position( channel, 0, G_SEEK_SET, 0 );

-	GIOStatus rc = g_io_channel_read_chars( channel,

-                                            buf, 1,

-                                            &bytes_read,

-                                            &error );

-	printf("%s\n",buf);

-	

-	time_t current_time = time(NULL);

-	if (gpio_button.irq_inited)

-	{

-		Button* button = object_get_button((Object*)user_data);

-		if (buf[0] == '0')

-		{

-			printf("Power Button pressed\n");

-			button_emit_pressed(button);

-			button_set_timer(button,(long)current_time);

-		}

-		else

-		{

-			long press_time = current_time-button_get_timer(button);

-			printf("Power Button released, held for %ld seconds\n",press_time);

-			if (press_time > LONG_PRESS_SECONDS)

-			{

-				button_emit_pressed_long(button);

-			} else {

-				button_emit_released(button);

-			}

-		}

-	} 

-	else { gpio_button.irq_inited = true; }

-

-	return TRUE;

-}

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

-	//g_print ("Acquired a message bus connection: %s\n",name);

- 	cmdline *cmd = user_data;

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-  	int i=0;

-	gchar *s;

-	s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);

-	object = object_skeleton_new (s);

-	g_free (s);

-

-	Button* button = button_skeleton_new ();

-	object_skeleton_set_button (object, button);

-	g_object_unref (button);

-

-	ObjectMapper* mapper = object_mapper_skeleton_new ();

-	object_skeleton_set_object_mapper (object, mapper);

-	g_object_unref (mapper);

-

-	//define method callbacks

-	g_signal_connect (button,

-                   "handle-is-on",

-                   G_CALLBACK (on_is_on),

-                   NULL); /* user_data */

-	g_signal_connect (button,

-                    "handle-sim-press",

-                    G_CALLBACK (on_button_press),

-                    NULL); /* user_data */

-

-		

-	/* Export the object (@manager takes its own reference to @object) */

-	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-	g_object_unref (object);

-

-	/* Export all objects */

-	g_dbus_object_manager_server_set_connection (manager, connection);

-

-	// get gpio device paths

-	int rc = GPIO_OK;

-	do {

-		rc = gpio_init(connection,&gpio_button);

-		if (rc != GPIO_OK) { break; }

-		rc = gpio_open_interrupt(&gpio_button,on_button_interrupt,object);

-		if (rc != GPIO_OK) { break; }

-	} while(0);

-	if (rc != GPIO_OK)

-	{

-		printf("ERROR PowerButton: GPIO setup (rc=%d)\n",rc);

-	}

-	emit_object_added((GDBusObjectManager*)manager); 

-}

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-}

-

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include <stdio.h>
+#include "interfaces/openbmc_intf.h"
+#include "gpio.h"
+#include "openbmc.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/buttons";
+static const gchar* instance_name = "power0";
+static const gchar* dbus_name = "org.openbmc.buttons.Power";
+static const int LONG_PRESS_SECONDS = 3;
+static GDBusObjectManagerServer *manager = NULL;
+
+//This object will use these GPIOs
+GPIO gpio_button = (GPIO){ "POWER_BUTTON" };
+
+static gboolean
+on_is_on(Button *btn,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	gboolean btn_state=button_get_state(btn);
+	button_complete_is_on(btn,invocation,btn_state);
+	return TRUE;
+}
+
+static gboolean
+on_button_press(Button *btn,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	button_emit_pressed(btn);
+	button_complete_sim_press(btn,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_button_interrupt( GIOChannel *channel,
+		GIOCondition condition,
+		gpointer user_data )
+{
+	GError *error = 0;
+	gsize bytes_read = 0;
+	gchar buf[2];
+	buf[1] = '\0';
+	g_io_channel_seek_position( channel, 0, G_SEEK_SET, 0 );
+	g_io_channel_read_chars(channel,
+			buf, 1,
+			&bytes_read,
+			&error );
+	printf("%s\n",buf);
+
+	time_t current_time = time(NULL);
+	if(gpio_button.irq_inited)
+	{
+		Button* button = object_get_button((Object*)user_data);
+		if(buf[0] == '0')
+		{
+			printf("Power Button pressed\n");
+			button_emit_pressed(button);
+			button_set_timer(button,(long)current_time);
+		}
+		else
+		{
+			long press_time = current_time-button_get_timer(button);
+			printf("Power Button released, held for %ld seconds\n",press_time);
+			if(press_time > LONG_PRESS_SECONDS)
+			{
+				button_emit_pressed_long(button);
+			} else {
+				button_emit_released(button);
+			}
+		}
+	}
+	else { gpio_button.irq_inited = true; }
+
+	return TRUE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+	//g_print ("Acquired a message bus connection: %s\n",name);
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	gchar *s;
+	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
+	object = object_skeleton_new(s);
+	g_free(s);
+
+	Button* button = button_skeleton_new();
+	object_skeleton_set_button(object, button);
+	g_object_unref(button);
+
+	//define method callbacks
+	g_signal_connect(button,
+			"handle-is-on",
+			G_CALLBACK(on_is_on),
+			NULL); /* user_data */
+	g_signal_connect(button,
+			"handle-sim-press",
+			G_CALLBACK(on_button_press),
+			NULL); /* user_data */
+
+
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_set_connection(manager, connection);
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
+
+	// get gpio device paths
+	int rc = GPIO_OK;
+	do {
+		rc = gpio_init(connection,&gpio_button);
+		if(rc != GPIO_OK) { break; }
+		rc = gpio_open_interrupt(&gpio_button,on_button_interrupt,object);
+		if(rc != GPIO_OK) { break; }
+	} while(0);
+	if(rc != GPIO_OK)
+	{
+		printf("ERROR PowerButton: GPIO setup (rc=%d)\n",rc);
+	}
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/button_reset_obj.c b/objects/button_reset_obj.c
old mode 100755
new mode 100644
index 759e83a..a9321e3
--- a/objects/button_reset_obj.c
+++ b/objects/button_reset_obj.c
@@ -2,60 +2,58 @@
 #include "interfaces/openbmc_intf.h"
 #include "gpio.h"
 #include "openbmc.h"
-#include "object_mapper.h"
 
-/* ---------------------------------------------------------------------------------------------------- */
+/* ------------------------------------------------------------------------- */
 static const gchar* dbus_object_path = "/org/openbmc/buttons";
 static const gchar* instance_name = "reset0";
-static const gchar* dbus_name        = "org.openbmc.buttons.reset";
+static const gchar* dbus_name = "org.openbmc.buttons.reset";
 static const int LONG_PRESS_SECONDS = 3;
 static GDBusObjectManagerServer *manager = NULL;
 
 //This object will use these GPIOs
-GPIO gpio_button    = (GPIO){ "RESET_BUTTON" };
+GPIO gpio_button = (GPIO){ "RESET_BUTTON" };
 
 static gboolean
-on_is_on       (Button          *btn,
-                GDBusMethodInvocation  *invocation,
-                gpointer                user_data)
+on_is_on(Button *btn,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
 {
-  gboolean btn_state=button_get_state(btn);
-  button_complete_is_on(btn,invocation,btn_state);
-  return TRUE;
-
+	gboolean btn_state=button_get_state(btn);
+	button_complete_is_on(btn,invocation,btn_state);
+	return TRUE;
 }
 
 static gboolean
-on_button_press       (Button          *btn,
-                GDBusMethodInvocation  *invocation,
-                gpointer                user_data)
+on_button_press(Button *btn,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
 {
 	button_emit_pressed(btn);
 	button_complete_sim_press(btn,invocation);
 	return TRUE;
 }
+
 static gboolean
 on_button_interrupt( GIOChannel *channel,
-               GIOCondition condition,
-               gpointer user_data )
+		GIOCondition condition,
+		gpointer user_data )
 {
-
 	GError *error = 0;
 	gsize bytes_read = 0;
-	gchar buf[2]; 
+	gchar buf[2];
 	buf[1] = '\0';
 	g_io_channel_seek_position( channel, 0, G_SEEK_SET, 0 );
-	GIOStatus rc = g_io_channel_read_chars( channel,
-                                            buf, 1,
-                                            &bytes_read,
-                                            &error );
+	g_io_channel_read_chars( channel,
+			buf, 1,
+			&bytes_read,
+			&error );
 	printf("%s\n",buf);
-	
+
 	time_t current_time = time(NULL);
-	if (gpio_button.irq_inited)
+	if(gpio_button.irq_inited)
 	{
 		Button* button = object_get_button((Object*)user_data);
-		if (buf[0] == '0')
+		if(buf[0] == '0')
 		{
 			printf("reset Button pressed\n");
 			button_emit_pressed(button);
@@ -65,115 +63,105 @@
 		{
 			long press_time = current_time-button_get_timer(button);
 			printf("reset Button released, held for %ld seconds\n",press_time);
-			if (press_time > LONG_PRESS_SECONDS)
+			if(press_time > LONG_PRESS_SECONDS)
 			{
 				button_emit_pressed_long(button);
 			} else {
 				button_emit_released(button);
 			}
 		}
-	} 
+	}
 	else { gpio_button.irq_inited = true; }
 
 	return TRUE;
 }
-static void 
-on_bus_acquired (GDBusConnection *connection,
-                 const gchar     *name,
-                 gpointer         user_data)
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
 {
 	ObjectSkeleton *object;
 	//g_print ("Acquired a message bus connection: %s\n",name);
- 	cmdline *cmd = user_data;
-  	manager = g_dbus_object_manager_server_new (dbus_object_path);
-  	int i=0;
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
 	gchar *s;
-	s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);
-	object = object_skeleton_new (s);
-	g_free (s);
+	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
+	object = object_skeleton_new(s);
+	g_free(s);
 
-	Button* button = button_skeleton_new ();
-	object_skeleton_set_button (object, button);
-	g_object_unref (button);
-
-	ObjectMapper* mapper = object_mapper_skeleton_new ();
-	object_skeleton_set_object_mapper (object, mapper);
-	g_object_unref (mapper);
+	Button* button = button_skeleton_new();
+	object_skeleton_set_button(object, button);
+	g_object_unref(button);
 
 	//define method callbacks
-	g_signal_connect (button,
-                   "handle-is-on",
-                   G_CALLBACK (on_is_on),
-                   NULL); /* user_data */
-	g_signal_connect (button,
-                    "handle-sim-press",
-                    G_CALLBACK (on_button_press),
-                    NULL); /* user_data */
+	g_signal_connect(button,
+			"handle-is-on",
+			G_CALLBACK(on_is_on),
+			NULL); /* user_data */
+	g_signal_connect(button,
+			"handle-sim-press",
+			G_CALLBACK(on_button_press),
+			NULL); /* user_data */
 
-		
+
 	/* Export the object (@manager takes its own reference to @object) */
-	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
-	g_object_unref (object);
-
-	/* Export all objects */
-	g_dbus_object_manager_server_set_connection (manager, connection);
+	g_dbus_object_manager_server_set_connection(manager, connection);
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
 
 	// get gpio device paths
 	int rc = GPIO_OK;
 	do {
 		rc = gpio_init(connection,&gpio_button);
-		if (rc != GPIO_OK) { break; }
+		if(rc != GPIO_OK) { break; }
 		rc = gpio_open_interrupt(&gpio_button,on_button_interrupt,object);
-		if (rc != GPIO_OK) { break; }
+		if(rc != GPIO_OK) { break; }
 	} while(0);
-	if (rc != GPIO_OK)
+	if(rc != GPIO_OK)
 	{
 		printf("ERROR PowerButton: GPIO setup (rc=%d)\n",rc);
 	}
-	emit_object_added((GDBusObjectManager*)manager); 
 }
 
 static void
-on_name_acquired (GDBusConnection *connection,
-                  const gchar     *name,
-                  gpointer         user_data)
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
 {
 }
 
 static void
-on_name_lost (GDBusConnection *connection,
-              const gchar     *name,
-              gpointer         user_data)
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
 {
 }
 
-
 gint
-main (gint argc, gchar *argv[])
+main(gint argc, gchar *argv[])
 {
-  GMainLoop *loop;
+	GMainLoop *loop;
 
-  cmdline cmd;
-  cmd.argc = argc;
-  cmd.argv = argv;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
 
-  guint id;
-  loop = g_main_loop_new (NULL, FALSE);
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
 
-  id = g_bus_own_name (DBUS_TYPE,
-                       dbus_name,
-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
-                       on_bus_acquired,
-                       on_name_acquired,
-                       on_name_lost,
-                       &cmd,
-                       NULL);
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
 
-  g_main_loop_run (loop);
-  
-  g_bus_unown_name (id);
-  g_main_loop_unref (loop);
-  return 0;
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
 }
-
diff --git a/objects/control_bmc_barreleye.c b/objects/control_bmc_barreleye.c
index ddfde88..f09e379 100644
--- a/objects/control_bmc_barreleye.c
+++ b/objects/control_bmc_barreleye.c
@@ -1,249 +1,247 @@
-#include <stdint.h>

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <fcntl.h>

-#include <unistd.h>

-#include <sys/stat.h>

-#include <sys/mman.h>

-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include "gpio.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/control";

-static const gchar* instance_name = "bmc0";

-static const gchar* dbus_name        = "org.openbmc.control.Bmc";

-static const gchar* i2c_dev = "/sys/bus/i2c/devices";

-

-//this probably should come from some global SOC config

-

-#define LPC_BASE		(off_t)0x1e789000

-#define LPC_HICR6		0x80

-#define LPC_HICR7		0x88

-#define LPC_HICR8		0x8c

-#define SPI_BASE		(off_t)0x1e630000

-#define SCU_BASE                (off_t)0x1e780000

-#define UART_BASE               (off_t)0x1e783000

-#define COM_BASE                (off_t)0x1e789000

-#define COM_BASE2               (off_t)0x1e789100

-#define GPIO_BASE		(off_t)0x1e6e2000

-

-static GDBusObjectManagerServer *manager = NULL;

-

-void* memmap(int mem_fd,off_t base)

-{

-	void* bmcreg;

-	bmcreg = mmap(NULL, getpagesize(),

-			PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, base);

-

-	if (bmcreg == MAP_FAILED) {

-		printf("ERROR: 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) {

-		printf("ERROR: 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,0x30000C00); //32M PNOR

-	devmem(bmcreg+LPC_HICR8,0xFC0003FF);

-

-	//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 UART routing

-

-	bmcreg = memmap(mem_fd,SCU_BASE);

-	devmem(bmcreg+0x00,0x9e82fce7);

-	//devmem(bmcreg+0x00,0x9f82fce7); // B2?

-	devmem(bmcreg+0x04,0x0370e677);

-	

-	// do not modify state of power pin, otherwise 

-	// if this is a reboot, host will shutdown

-	uint32_t reg_20 = devmem_read(bmcreg+0x20);

-	reg_20 = reg_20 & 0x00000002;	

-	devmem(bmcreg+0x20,0xcfc8f7fd | reg_20);

-	devmem(bmcreg+0x24,0xc738f20a);

-	devmem(bmcreg+0x80,0x0031ffaf);

-

-

-	//GPIO

-	bmcreg = memmap(mem_fd,GPIO_BASE);

-	devmem(bmcreg+0x84,0x00fff0c0);  //Enable UART1

-	devmem(bmcreg+0x80,0xCB000000);

-	devmem(bmcreg+0x88,0x01C000FF);

-	devmem(bmcreg+0x8c,0xC1C000FF);

-	devmem(bmcreg+0x90,0x003FA009);

-	devmem(bmcreg+0x88,0x01C0007F);

-

-

-	bmcreg = memmap(mem_fd,COM_BASE);

-	devmem(bmcreg+0x170,0x00000042);

-	devmem(bmcreg+0x174,0x00004000);

-

-	close(mem_fd);

-}

-

-int init_i2c_driver(int i2c_bus, const char* device, int address,bool delete)

-{

-	char dev[255];

-	g_print("Initing: device = %s, address = %02x\n",device,address);

-	if (!delete) {

-		sprintf(dev,"%s/i2c-%d/new_device",i2c_dev,i2c_bus);

-	} else {

-		sprintf(dev,"%s/i2c-%d/delete_device",i2c_dev,i2c_bus);

-	}

-	int fd = open(dev, O_WRONLY);

-	if (fd == -1) {

-		g_print("ERROR control_bmc: Unable to open device %s\n",dev);

-		return 1;

-	}

-	if (!delete) {

-		sprintf(dev,"%s 0x%02x",device,address);

-	} else {

-		sprintf(dev,"0x%02x",address);

-	}

-	int rc = write(fd,dev,strlen(dev));

-	close(fd);

-	if (rc != strlen(dev)) {

-		g_print("ERROR control_bmc: Unable to write %s\n",dev);

-		return 2;

-	}

-	return 0;

-}

-

-

-static gboolean

-on_init (Control          *control,

-         GDBusMethodInvocation  *invocation,

-         gpointer                user_data)

-{

-	control_complete_init(control,invocation);

-	

-	return TRUE;

-}

-gboolean go(gpointer user_data)

-{

- 	cmdline *cmd = user_data;

-	Control* control = object_get_control((Object*)cmd->user_data);

-	#ifdef __arm__

-	reg_init();

-	#endif

-	control_emit_goto_system_state(control,"BMC_STARTING");

-	

-	return FALSE;

-}

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

- 	cmdline *cmd = user_data;

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-

-	gchar *s;

-	s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);

-	object = object_skeleton_new (s);

-	g_free (s);

-

-	ControlBmc* control_bmc = control_bmc_skeleton_new ();

-	object_skeleton_set_control_bmc (object, control_bmc);

-	g_object_unref (control_bmc);

-

-	Control* control = control_skeleton_new ();

-	object_skeleton_set_control (object, control);

-	g_object_unref (control);

-

-	//define method callbacks here

-	g_signal_connect (control,

-       	            "handle-init",

-               	    G_CALLBACK (on_init),

-               	    NULL); /* user_data */

-

-	/* Export the object (@manager takes its own reference to @object) */

-	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-	g_object_unref (object);

-

-	/* Export all objects */

-	g_dbus_object_manager_server_set_connection (manager, connection);

-

-	//TODO:  This is a bad hack to wait for object to be on bus

-	//sleep(1);

-	cmd->user_data = object;

-	g_idle_add(go,cmd);

-}

-

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-

-

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-}

-

-

-/*----------------------------------------------------------------*/

-/* Main Event Loop                                                */

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-  cmd.loop = loop;

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+#include "gpio.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/control";
+static const gchar* instance_name = "bmc0";
+static const gchar* dbus_name = "org.openbmc.control.Bmc";
+static const gchar* i2c_dev = "/sys/bus/i2c/devices";
+
+//this probably should come from some global SOC config
+
+#define LPC_BASE		(off_t)0x1e789000
+#define LPC_HICR6		0x80
+#define LPC_HICR7		0x88
+#define LPC_HICR8		0x8c
+#define SPI_BASE		(off_t)0x1e630000
+#define SCU_BASE		(off_t)0x1e780000
+#define UART_BASE		(off_t)0x1e783000
+#define COM_BASE		(off_t)0x1e789000
+#define COM_BASE2		(off_t)0x1e789100
+#define GPIO_BASE		(off_t)0x1e6e2000
+
+static GDBusObjectManagerServer *manager = NULL;
+
+void*
+memmap(int mem_fd,off_t base)
+{
+	void* bmcreg;
+	bmcreg = mmap(NULL, getpagesize(),
+			PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, base);
+
+	if(bmcreg == MAP_FAILED) {
+		printf("ERROR: 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) {
+		printf("ERROR: 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,0x30000C00); //32M PNOR
+	devmem(bmcreg+LPC_HICR8,0xFC0003FF);
+
+	//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 UART routing
+
+	bmcreg = memmap(mem_fd,SCU_BASE);
+	devmem(bmcreg+0x00,0x9e82fce7);
+	//devmem(bmcreg+0x00,0x9f82fce7); // B2?
+	devmem(bmcreg+0x04,0x0370e677);
+
+	// do not modify state of power pin, otherwise
+	// if this is a reboot, host will shutdown
+	uint32_t reg_20 = devmem_read(bmcreg+0x20);
+	reg_20 = reg_20 & 0x00000002;
+	devmem(bmcreg+0x20,0xcfc8f7fd | reg_20);
+	devmem(bmcreg+0x24,0xc738f20a);
+	devmem(bmcreg+0x80,0x0031ffaf);
+
+
+	//GPIO
+	bmcreg = memmap(mem_fd,GPIO_BASE);
+	devmem(bmcreg+0x84,0x00fff0c0);  //Enable UART1
+	devmem(bmcreg+0x80,0xCB000000);
+	devmem(bmcreg+0x88,0x01C000FF);
+	devmem(bmcreg+0x8c,0xC1C000FF);
+	devmem(bmcreg+0x90,0x003FA009);
+	devmem(bmcreg+0x88,0x01C0007F);
+
+
+	bmcreg = memmap(mem_fd,COM_BASE);
+	devmem(bmcreg+0x170,0x00000042);
+	devmem(bmcreg+0x174,0x00004000);
+
+	close(mem_fd);
+}
+
+int
+init_i2c_driver(int i2c_bus, const char* device, int address,bool delete)
+{
+	char dev[255];
+	g_print("Initing: device = %s, address = %02x\n",device,address);
+	if(!delete) {
+		sprintf(dev,"%s/i2c-%d/new_device",i2c_dev,i2c_bus);
+	} else {
+		sprintf(dev,"%s/i2c-%d/delete_device",i2c_dev,i2c_bus);
+	}
+	int fd = open(dev, O_WRONLY);
+	if(fd == -1) {
+		g_print("ERROR control_bmc: Unable to open device %s\n",dev);
+		return 1;
+	}
+	if(!delete) {
+		sprintf(dev,"%s 0x%02x",device,address);
+	} else {
+		sprintf(dev,"0x%02x",address);
+	}
+	int rc = write(fd,dev,strlen(dev));
+	close(fd);
+	if(rc != strlen(dev)) {
+		g_print("ERROR control_bmc: Unable to write %s\n",dev);
+		return 2;
+	}
+	return 0;
+}
+
+static gboolean
+on_init(Control *control,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	control_complete_init(control,invocation);
+
+	return TRUE;
+}
+
+gboolean
+go(gpointer user_data)
+{
+	cmdline *cmd = user_data;
+	Control* control = object_get_control((Object*)cmd->user_data);
+#ifdef __arm__
+	reg_init();
+#endif
+	control_emit_goto_system_state(control,"BMC_STARTING");
+
+	return FALSE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+	cmdline *cmd = user_data;
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+
+	gchar *s;
+	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
+	object = object_skeleton_new(s);
+	g_free(s);
+
+	ControlBmc* control_bmc = control_bmc_skeleton_new();
+	object_skeleton_set_control_bmc(object, control_bmc);
+	g_object_unref(control_bmc);
+
+	Control* control = control_skeleton_new();
+	object_skeleton_set_control(object, control);
+	g_object_unref(control);
+
+	//define method callbacks here
+	g_signal_connect(control,
+			"handle-init",
+			G_CALLBACK(on_init),
+			NULL); /* user_data */
+
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
+
+	/* Export all objects */
+	g_dbus_object_manager_server_set_connection(manager, connection);
+
+	//TODO:  This is a bad hack to wait for object to be on bus
+	//sleep(1);
+	cmd->user_data = object;
+	g_idle_add(go,cmd);
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar     *name,
+		gpointer         user_data)
+{
+}
+
+/*----------------------------------------------------------------*/
+/* Main Event Loop                                                */
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+	cmd.loop = loop;
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/control_bmc_obj.c b/objects/control_bmc_obj.c
index f1a47c7..f3571cd 100644
--- a/objects/control_bmc_obj.c
+++ b/objects/control_bmc_obj.c
@@ -1,120 +1,122 @@
-#include <stdint.h>

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <fcntl.h>

-#include <unistd.h>

-#include <sys/stat.h>

-#include <sys/mman.h>

-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include "gpio.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/control";

-static const gchar* instance_name = "bmc0";

-static const gchar* dbus_name        = "org.openbmc.control.Bmc";

-

-//this probably should come from some global SOC config

-

-#define LPC_BASE		(off_t)0x1e789000

-#define LPC_HICR6		0x80

-#define LPC_HICR7		0x88

-#define LPC_HICR8		0x8c

-#define SPI_BASE		(off_t)0x1e630000

-#define SCU_BASE                (off_t)0x1e780000

-#define UART_BASE               (off_t)0x1e783000

-#define COM_BASE                (off_t)0x1e789000

-#define COM_BASE2               (off_t)0x1e789100

-#define GPIO_BASE		(off_t)0x1e6e2000

-

-static GDBusObjectManagerServer *manager = NULL;

-

-void* memmap(int mem_fd,off_t base)

-{

-	void* bmcreg;

-	bmcreg = mmap(NULL, getpagesize(),

-			PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, base);

-

-	if (bmcreg == MAP_FAILED) {

-		printf("ERROR: 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) {

-		printf("ERROR: 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 UART routing

-

-	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);

-

-	bmcreg = memmap(mem_fd,COM_BASE);

-	devmem(bmcreg+0x170,0x00000042);

-	devmem(bmcreg+0x174,0x00004000);

-

-

-	close(mem_fd);

-}

-

-static gboolean

-on_init (Control          *control,

-         GDBusMethodInvocation  *invocation,

-         gpointer                user_data)

-{

-	//#ifdef __arm__

-	//reg_init();

-	//#endif

-	control_complete_init(control,invocation);

-	//control_emit_goto_system_state(control,"BMC_STARTING");

-	return TRUE;

-}

+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+#include "gpio.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/control";
+static const gchar* instance_name = "bmc0";
+static const gchar* dbus_name = "org.openbmc.control.Bmc";
+
+//this probably should come from some global SOC config
+
+#define LPC_BASE		(off_t)0x1e789000
+#define LPC_HICR6		0x80
+#define LPC_HICR7		0x88
+#define LPC_HICR8		0x8c
+#define SPI_BASE		(off_t)0x1e630000
+#define SCU_BASE		(off_t)0x1e780000
+#define UART_BASE		(off_t)0x1e783000
+#define COM_BASE		(off_t)0x1e789000
+#define COM_BASE2		(off_t)0x1e789100
+#define GPIO_BASE		(off_t)0x1e6e2000
+
+static GDBusObjectManagerServer *manager = NULL;
+
+void*
+memmap(int mem_fd,off_t base)
+{
+	void* bmcreg;
+	bmcreg = mmap(NULL, getpagesize(),
+			PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, base);
+
+	if(bmcreg == MAP_FAILED) {
+		printf("ERROR: 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) {
+		printf("ERROR: 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 UART routing
+
+	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);
+
+	bmcreg = memmap(mem_fd,COM_BASE);
+	devmem(bmcreg+0x170,0x00000042);
+	devmem(bmcreg+0x174,0x00004000);
+
+
+	close(mem_fd);
+}
 
 static gboolean
-on_warm_reset (ControlBmc            	*bmc,
-               GDBusMethodInvocation	*invocation,
-               gpointer		            user_data)
+on_init(Control *control,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	//#ifdef __arm__
+	//reg_init();
+	//#endif
+	control_complete_init(control,invocation);
+	//control_emit_goto_system_state(control,"BMC_STARTING");
+	return TRUE;
+}
+
+static gboolean
+on_warm_reset(ControlBmc *bmc,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
 {
 	GError *err = NULL;
 	/* Wait a while before reboot, so the caller can be responded.
@@ -124,7 +126,7 @@
 	gchar *reboot_command = "/bin/sh -c 'sleep 3;reboot'";
 
 	g_spawn_command_line_async(reboot_command, &err);
-	if (err != NULL) {
+	if(err != NULL) {
 		fprintf(stderr, "warmReset() error: %s\n", err->message);
 		g_error_free(err);
 	}
@@ -133,112 +135,109 @@
 	return TRUE;
 }
 
-gboolean go(gpointer user_data)

-{

- 	cmdline *cmd = user_data;

-	Control* control = object_get_control((Object*)cmd->user_data);

-	#ifdef __arm__

-	reg_init();

-	#endif

-	control_emit_goto_system_state(control,"BMC_STARTING");

-

-	//g_main_loop_quit(cmd->loop);

-	return FALSE;

-}

+gboolean
+go(gpointer user_data)
+{
+	cmdline *cmd = user_data;
+	Control* control = object_get_control((Object*)cmd->user_data);
+#ifdef __arm__
+	reg_init();
+#endif
+	control_emit_goto_system_state(control,"BMC_STARTING");
+
+	//g_main_loop_quit(cmd->loop);
+	return FALSE;
+}
 
 static void
-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

- 	cmdline *cmd = user_data;

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-

-	gchar *s;

-	s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);

-	object = object_skeleton_new (s);

-	g_free (s);

-

-	ControlBmc* control_bmc = control_bmc_skeleton_new ();

-	object_skeleton_set_control_bmc (object, control_bmc);

-	g_object_unref (control_bmc);

-

-	Control* control = control_skeleton_new ();

-	object_skeleton_set_control (object, control);

-	g_object_unref (control);

-

-	//define method callbacks here

-	g_signal_connect (control,

-       	            "handle-init",

-               	    G_CALLBACK (on_init),

-               	    NULL); /* user_data */

-

+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+	cmdline *cmd = user_data;
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
 
-	g_signal_connect (control_bmc,
-		"handle-warm-reset",
-		G_CALLBACK (on_warm_reset),
-		NULL); /* user_data */
+	gchar *s;
+	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
+	object = object_skeleton_new(s);
+	g_free(s);
 
-	/* Export the object (@manager takes its own reference to @object) */

-	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-	g_object_unref (object);

-

-	/* Export all objects */

-	g_dbus_object_manager_server_set_connection (manager, connection);

-

-	//TODO:  This is a bad hack to wait for object to be on bus

-	//sleep(1);

-	cmd->user_data = object;

-	//g_idle_add(go,cmd);

-}

-

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-

-

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-}

-

-

-/*----------------------------------------------------------------*/

-/* Main Event Loop                                                */

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-  cmd.loop = loop;

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

+	ControlBmc* control_bmc = control_bmc_skeleton_new();
+	object_skeleton_set_control_bmc(object, control_bmc);
+	g_object_unref(control_bmc);
 
-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+	Control* control = control_skeleton_new();
+	object_skeleton_set_control(object, control);
+	g_object_unref(control);
+
+	//define method callbacks here
+	g_signal_connect(control,
+			"handle-init",
+			G_CALLBACK(on_init),
+			NULL); /* user_data */
+
+
+	g_signal_connect(control_bmc,
+			"handle-warm-reset",
+			G_CALLBACK(on_warm_reset),
+			NULL); /* user_data */
+
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
+
+	/* Export all objects */
+	g_dbus_object_manager_server_set_connection(manager, connection);
+
+	//TODO:  This is a bad hack to wait for object to be on bus
+	//sleep(1);
+	cmd->user_data = object;
+	//g_idle_add(go,cmd);
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+/*----------------------------------------------------------------*/
+/* Main Event Loop                                                */
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+	cmd.loop = loop;
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/control_host_obj.c b/objects/control_host_obj.c
old mode 100755
new mode 100644
index ac72b6e..9253007
--- a/objects/control_host_obj.c
+++ b/objects/control_host_obj.c
@@ -1,274 +1,266 @@
-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <fcntl.h>

-#include <unistd.h>

-#include <sys/stat.h>

-#include <sys/mman.h>

-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include "gpio.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/control";

-static const gchar* instance_name = "host0";

-static const gchar* dbus_name = "org.openbmc.control.Host";

-

-static GDBusObjectManagerServer *manager = NULL;

-

-GPIO fsi_data     = (GPIO){ "FSI_DATA" };

-GPIO fsi_clk      = (GPIO){ "FSI_CLK" };

-GPIO fsi_enable   = (GPIO){ "FSI_ENABLE" };

-GPIO cronus_sel   = (GPIO){ "CRONUS_SEL" };

-GPIO Throttle     = (GPIO){ "BMC_THROTTLE" };

-

-/* Bit bang patterns */

-

-//putcfam pu 281c 30000000 -p0 (Primary Side Select)

-static const char* primary = "000011111111110101111000111001100111111111111111111111111111101111111111";

-//putcfam pu 281c B0000000 -p0

-static const char* go = "000011111111110101111000111000100111111111111111111111111111101101111111";

-//putcfam pu 0x281c 30900000 (Golden Side Select)

-static const char* golden = "000011111111110101111000111001100111101101111111111111111111101001111111";

-

-/* Setup attentions */

-//putcfam pu 0x081C 20000000

-static const char* attnA = "000011111111111101111110001001101111111111111111111111111111110001111111";

-//putcfam pu 0x100D 40000000

-static const char* attnB = "000011111111111011111100101001011111111111111111111111111111110001111111";

-//putcfam pu  0x100B FFFFFFFF

-static const char* attnC = "000011111111111011111101001000000000000000000000000000000000001011111111";

-

-

-

-static gboolean

-on_init         (Control       *control,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	control_complete_init(control,invocation);

-	return TRUE;

-}

-

-int fsi_bitbang(const char* pattern)

-{

-	int rc=GPIO_OK;

-	int i;

-	for(i=0;i<strlen(pattern);i++) {

-		rc = gpio_writec(&fsi_data,pattern[i]);

-		if (rc!=GPIO_OK) { break; }

-		rc = gpio_clock_cycle(&fsi_clk,1);

-		if (rc!=GPIO_OK) { break; }

-	}

-	return rc;

-	

-}

-

-int fsi_standby()

-{

-	int rc=GPIO_OK;

-	rc = gpio_write(&fsi_data,1);

-	if (rc!=GPIO_OK) { return rc; }

-	rc = gpio_clock_cycle(&fsi_clk,5000);

-	if (rc!=GPIO_OK) { return rc; }

-	return rc;

-}

-

-

-static gboolean

-on_boot         (ControlHost        *host,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	int rc = GPIO_OK;

-

-	if (control_host_get_debug_mode(host)==1)

-	{

-		g_print("Enabling debug mode; not booting host\n");

-		rc |= gpio_open(&fsi_enable);

-		rc |= gpio_open(&cronus_sel);

-		rc |= gpio_write(&fsi_enable,1);

-		rc |= gpio_write(&cronus_sel,0);

-		if (rc!=GPIO_OK) {

-			g_print("ERROR enabling debug mode: %d\n",rc);

-		}

-		return TRUE;

-	}

-	g_print("Booting host\n");

-	Control* control = object_get_control((Object*)user_data);

-	control_host_complete_boot(host,invocation);

-	do {	

-		rc = gpio_open(&fsi_clk);

-		rc |= gpio_open(&fsi_data);

-		rc |= gpio_open(&fsi_enable);

-		rc |= gpio_open(&cronus_sel);

-		rc |= gpio_open(&Throttle);

-		if (rc!=GPIO_OK) { break; }

-

-		//setup dc pins		

-		rc = gpio_write(&cronus_sel,1);

-		rc |= gpio_write(&fsi_enable,1);

-		rc |= gpio_write(&fsi_clk,1);

-		rc |= gpio_write(&Throttle,1);

-		if (rc!=GPIO_OK) { break; }

-

-		//data standy state

-		rc = fsi_standby();

-

-		//clear out pipes

-		rc |= gpio_write(&fsi_data,0);

-		rc |= gpio_clock_cycle(&fsi_clk,256);

-		rc |= gpio_write(&fsi_data,1);

-		rc |= gpio_clock_cycle(&fsi_clk,50);

-		if (rc!=GPIO_OK) { break; }

-

-		rc = fsi_bitbang(attnA);

-		rc |= fsi_standby();

-

-		rc |= fsi_bitbang(attnB);

-		rc |= fsi_standby();

-

-		rc |= fsi_bitbang(attnC);

-		rc |= fsi_standby();

-		if (rc!=GPIO_OK) { break; }

-

-		const gchar* flash_side = control_host_get_flash_side(host);

-		g_print("Using %s side of the bios flash\n",flash_side);

-		if (strcmp(flash_side,"primary")==0) {

-			rc |= fsi_bitbang(primary);

-		} else if (strcmp(flash_side,"golden") == 0) {

-			rc |= fsi_bitbang(golden);

-		} else {

-			g_print("ERROR: Invalid flash side: %s\n",flash_side);

-			rc = 0xff;

-			

-		}

-		rc |= fsi_standby();

-		if (rc!=GPIO_OK) { break; }

-		

-		rc = fsi_bitbang(go);

-

-		rc |= gpio_write(&fsi_data,1); /* Data standby state */

-		rc |= gpio_clock_cycle(&fsi_clk,2);

-

-	        rc |= gpio_write(&fsi_clk,0); /* hold clk low for clock mux */

-	        rc |= gpio_write(&fsi_enable,0);

-	        rc |= gpio_clock_cycle(&fsi_clk,16);

-	        rc |= gpio_write(&fsi_clk,0); /* Data standby state */

-	

-	} while(0);

-	if (rc != GPIO_OK)

-	{

-		g_print("ERROR HostControl: GPIO sequence failed (rc=%d)\n",rc);

-	} else {

-		control_emit_goto_system_state(control,"HOST_BOOTING");

-	}

-	gpio_close(&fsi_clk);

-	gpio_close(&fsi_data);

-	gpio_close(&fsi_enable);

-	gpio_close(&cronus_sel);

-	gpio_close(&Throttle);

-

-	control_host_emit_booted(host);

-	return TRUE;

-}

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

-	//g_print ("Acquired a message bus connection: %s\n",name);

- 	cmdline *cmd = user_data;

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-

-	gchar *s;

-	s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);

-	object = object_skeleton_new (s);

-	g_free (s);

-

-	ControlHost* control_host = control_host_skeleton_new ();

-	object_skeleton_set_control_host (object, control_host);

-	g_object_unref (control_host);

-

-	Control* control = control_skeleton_new ();

-	object_skeleton_set_control (object, control);

-	g_object_unref (control);

-

-	ObjectMapper* mapper = object_mapper_skeleton_new ();

-	object_skeleton_set_object_mapper (object, mapper);

-	g_object_unref (mapper);

-

-	//define method callbacks here

-	g_signal_connect (control_host,

-                 "handle-boot",

-                 G_CALLBACK (on_boot),

-                 object); /* user_data */

-	g_signal_connect (control,

-                 "handle-init",

-                 G_CALLBACK (on_init),

-                 NULL); /* user_data */

-

-	control_host_set_debug_mode(control_host,0);

-	control_host_set_flash_side(control_host,"primary");

-

-	/* Export the object (@manager takes its own reference to @object) */

-	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-	g_object_unref (object);

-

-	/* Export all objects */

-	g_dbus_object_manager_server_set_connection (manager, connection);

-	

-	gpio_init(connection,&fsi_data);

-	gpio_init(connection,&fsi_clk);

-	gpio_init(connection,&fsi_enable);

-	gpio_init(connection,&cronus_sel);

-	gpio_init(connection,&Throttle);

-	emit_object_added((GDBusObjectManager*)manager); 	

-}

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-//  g_print ("Acquired the name %s\n", name);

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-//  g_print ("Lost the name %s\n", name);

-}

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+#include "gpio.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/control";
+static const gchar* instance_name = "host0";
+static const gchar* dbus_name = "org.openbmc.control.Host";
+
+static GDBusObjectManagerServer *manager = NULL;
+
+GPIO fsi_data     = (GPIO){ "FSI_DATA" };
+GPIO fsi_clk      = (GPIO){ "FSI_CLK" };
+GPIO fsi_enable   = (GPIO){ "FSI_ENABLE" };
+GPIO cronus_sel   = (GPIO){ "CRONUS_SEL" };
+GPIO Throttle     = (GPIO){ "BMC_THROTTLE" };
+
+/* Bit bang patterns */
+
+//putcfam pu 281c 30000000 -p0 (Primary Side Select)
+static const char* primary = "000011111111110101111000111001100111111111111111111111111111101111111111";
+//putcfam pu 281c B0000000 -p0
+static const char* go = "000011111111110101111000111000100111111111111111111111111111101101111111";
+//putcfam pu 0x281c 30900000 (Golden Side Select)
+static const char* golden = "000011111111110101111000111001100111101101111111111111111111101001111111";
+
+/* Setup attentions */
+//putcfam pu 0x081C 20000000
+static const char* attnA = "000011111111111101111110001001101111111111111111111111111111110001111111";
+//putcfam pu 0x100D 40000000
+static const char* attnB = "000011111111111011111100101001011111111111111111111111111111110001111111";
+//putcfam pu  0x100B FFFFFFFF
+static const char* attnC = "000011111111111011111101001000000000000000000000000000000000001011111111";
+
+
+
+static gboolean
+on_init(Control *control,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	control_complete_init(control,invocation);
+	return TRUE;
+}
+
+int
+fsi_bitbang(const char* pattern)
+{
+	int rc=GPIO_OK;
+	int i;
+	for(i=0;i<strlen(pattern);i++) {
+		rc = gpio_writec(&fsi_data,pattern[i]);
+		if(rc!=GPIO_OK) { break; }
+		rc = gpio_clock_cycle(&fsi_clk,1);
+		if(rc!=GPIO_OK) { break; }
+	}
+	return rc;
+}
+
+int
+fsi_standby()
+{
+	int rc=GPIO_OK;
+	rc = gpio_write(&fsi_data,1);
+	if(rc!=GPIO_OK) { return rc; }
+	rc = gpio_clock_cycle(&fsi_clk,5000);
+	if(rc!=GPIO_OK) { return rc; }
+	return rc;
+}
+
+
+static gboolean
+on_boot(ControlHost *host,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	int rc = GPIO_OK;
+
+	if(control_host_get_debug_mode(host)==1)
+	{
+		g_print("Enabling debug mode; not booting host\n");
+		rc |= gpio_open(&fsi_enable);
+		rc |= gpio_open(&cronus_sel);
+		rc |= gpio_write(&fsi_enable,1);
+		rc |= gpio_write(&cronus_sel,0);
+		if(rc!=GPIO_OK) {
+			g_print("ERROR enabling debug mode: %d\n",rc);
+		}
+		return TRUE;
+	}
+	g_print("Booting host\n");
+	Control* control = object_get_control((Object*)user_data);
+	control_host_complete_boot(host,invocation);
+	do {
+		rc = gpio_open(&fsi_clk);
+		rc |= gpio_open(&fsi_data);
+		rc |= gpio_open(&fsi_enable);
+		rc |= gpio_open(&cronus_sel);
+		rc |= gpio_open(&Throttle);
+		if(rc!=GPIO_OK) { break; }
+
+		//setup dc pins
+		rc = gpio_write(&cronus_sel,1);
+		rc |= gpio_write(&fsi_enable,1);
+		rc |= gpio_write(&fsi_clk,1);
+		rc |= gpio_write(&Throttle,1);
+		if(rc!=GPIO_OK) { break; }
+
+		//data standy state
+		rc = fsi_standby();
+
+		//clear out pipes
+		rc |= gpio_write(&fsi_data,0);
+		rc |= gpio_clock_cycle(&fsi_clk,256);
+		rc |= gpio_write(&fsi_data,1);
+		rc |= gpio_clock_cycle(&fsi_clk,50);
+		if(rc!=GPIO_OK) { break; }
+
+		rc = fsi_bitbang(attnA);
+		rc |= fsi_standby();
+
+		rc |= fsi_bitbang(attnB);
+		rc |= fsi_standby();
+
+		rc |= fsi_bitbang(attnC);
+		rc |= fsi_standby();
+		if(rc!=GPIO_OK) { break; }
+
+		const gchar* flash_side = control_host_get_flash_side(host);
+		g_print("Using %s side of the bios flash\n",flash_side);
+		if(strcmp(flash_side,"primary")==0) {
+			rc |= fsi_bitbang(primary);
+		} else if(strcmp(flash_side,"golden") == 0) {
+			rc |= fsi_bitbang(golden);
+		} else {
+			g_print("ERROR: Invalid flash side: %s\n",flash_side);
+			rc = 0xff;
+
+		}
+		rc |= fsi_standby();
+		if(rc!=GPIO_OK) { break; }
+
+		rc = fsi_bitbang(go);
+
+		rc |= gpio_write(&fsi_data,1); /* Data standby state */
+		rc |= gpio_clock_cycle(&fsi_clk,2);
+
+		rc |= gpio_write(&fsi_clk,0); /* hold clk low for clock mux */
+		rc |= gpio_write(&fsi_enable,0);
+		rc |= gpio_clock_cycle(&fsi_clk,16);
+		rc |= gpio_write(&fsi_clk,0); /* Data standby state */
+
+	} while(0);
+	if(rc != GPIO_OK)
+	{
+		g_print("ERROR HostControl: GPIO sequence failed (rc=%d)\n",rc);
+	} else {
+		control_emit_goto_system_state(control,"HOST_BOOTING");
+	}
+	gpio_close(&fsi_clk);
+	gpio_close(&fsi_data);
+	gpio_close(&fsi_enable);
+	gpio_close(&cronus_sel);
+	gpio_close(&Throttle);
+
+	control_host_emit_booted(host);
+	return TRUE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+	//g_print ("Acquired a message bus connection: %s\n",name);
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+
+	gchar *s;
+	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
+	object = object_skeleton_new(s);
+	g_free(s);
+
+	ControlHost* control_host = control_host_skeleton_new();
+	object_skeleton_set_control_host(object, control_host);
+	g_object_unref(control_host);
+
+	Control* control = control_skeleton_new();
+	object_skeleton_set_control(object, control);
+	g_object_unref(control);
+
+	//define method callbacks here
+	g_signal_connect(control_host,
+			"handle-boot",
+			G_CALLBACK(on_boot),
+			object); /* user_data */
+	g_signal_connect(control,
+			"handle-init",
+			G_CALLBACK(on_init),
+			NULL); /* user_data */
+
+	control_host_set_debug_mode(control_host,0);
+	control_host_set_flash_side(control_host,"primary");
+
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_set_connection(manager, connection);
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
+
+	gpio_init(connection,&fsi_data);
+	gpio_init(connection,&fsi_clk);
+	gpio_init(connection,&fsi_enable);
+	gpio_init(connection,&cronus_sel);
+	gpio_init(connection,&Throttle);
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//  g_print ("Acquired the name %s\n", name);
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//  g_print ("Lost the name %s\n", name);
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/fan_generic_obj.c b/objects/fan_generic_obj.c
index fb61c5c..61083ae 100644
--- a/objects/fan_generic_obj.c
+++ b/objects/fan_generic_obj.c
@@ -1,137 +1,126 @@
-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-

-static const gchar* dbus_object_path = "/org/openbmc/control";

-static const gchar* dbus_name        = "org.openbmc.control.Fan";

-static guint heartbeat = 0;

-

-static GDBusObjectManagerServer *manager = NULL;

-

-static gboolean

-poll_sensor(gpointer user_data)

-{

-    //FruFan *fan = object_get_fan((Object*)user_data);

-    return TRUE;

-}

-

-

-

-static gboolean

-on_set_speed    (Fan  *fan,

-                GDBusMethodInvocation  *invocation,

-		guint                  speed,

-                gpointer                user_data)

-{

-  fan_set_speed(fan,speed);

-  fan_complete_set_speed(fan,invocation);

-  return TRUE;

-}

-

-static gboolean

-on_get_speed (Fan                 *fan,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-  guint reading = fan_get_speed(fan);

-  fan_complete_get_speed(fan,invocation,reading);

-  return TRUE;

-}

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-  	//g_print ("Acquired a message bus connection: %s\n",name);

-

-  	cmdline *cmd = user_data;

-	if (cmd->argc < 2)

-	{

-		g_print("No objects created.  Put object name(s) on command line\n");

-		return;

-	}	

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-  	int i=0;

-  	for (i=1;i<cmd->argc;i++)

-  	{

-		gchar *s;

- 		s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);

-		ObjectSkeleton *object = object_skeleton_new (s);

-		g_free (s);

-

-		Fan *fan = fan_skeleton_new ();

-  		object_skeleton_set_fan (object, fan);

-  		g_object_unref (fan);

-		

-		ObjectMapper* mapper = object_mapper_skeleton_new ();

-		object_skeleton_set_object_mapper (object, mapper);

-		g_object_unref (mapper);

-	

-  		//define method callbacks here

-  		g_signal_connect (fan,

-                    "handle-get-speed",

-                    G_CALLBACK (on_get_speed),

-                    NULL); /* user_data */

-  		g_signal_connect (fan,

-                    "handle-set-speed",

-                    G_CALLBACK (on_set_speed),

-                    NULL); /* user_data */

-

-		//g_timeout_add(poll_interval, poll_sensor, object);

-

-  		/* Export the object (@manager takes its own reference to @object) */

-  		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-  		g_object_unref (object);

-	}

-

-  /* Export all objects */

-  g_dbus_object_manager_server_set_connection (manager, connection);

-  emit_object_added((GDBusObjectManager*)manager); 

-}

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-  //g_print ("Acquired the name %s\n", name);

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-  //g_print ("Lost the name %s\n", name);

-}

-

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+
+/* ------------------------------------------------------------------------- */
+
+static const gchar* dbus_object_path = "/org/openbmc/control";
+static const gchar* dbus_name = "org.openbmc.control.Fan";
+static guint heartbeat = 0;
+
+static GDBusObjectManagerServer *manager = NULL;
+
+static gboolean
+poll_sensor(gpointer user_data)
+{
+	//FruFan *fan = object_get_fan((Object*)user_data);
+	return TRUE;
+}
+
+static gboolean
+on_set_speed(Fan *fan,
+		GDBusMethodInvocation *invocation,
+		guint speed,
+		gpointer user_data)
+{
+	fan_set_speed(fan,speed);
+	fan_complete_set_speed(fan,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_get_speed(Fan *fan,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	guint reading = fan_get_speed(fan);
+	fan_complete_get_speed(fan,invocation,reading);
+	return TRUE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//g_print ("Acquired a message bus connection: %s\n",name);
+
+	cmdline *cmd = user_data;
+	if(cmd->argc < 2)
+	{
+		g_print("No objects created.  Put object name(s) on command line\n");
+		return;
+	}
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	int i=0;
+	for(i=1;i<cmd->argc;i++)
+	{
+		gchar *s;
+		s = g_strdup_printf("%s/%s",dbus_object_path,cmd->argv[i]);
+		ObjectSkeleton *object = object_skeleton_new(s);
+		g_free(s);
+
+		Fan *fan = fan_skeleton_new();
+		object_skeleton_set_fan(object, fan);
+		g_object_unref(fan);
+
+		//define method callbacks here
+		g_signal_connect(fan,
+				"handle-get-speed",
+				G_CALLBACK(on_get_speed),
+				NULL); /* user_data */
+		g_signal_connect(fan,
+				"handle-set-speed",
+				G_CALLBACK(on_set_speed),
+				NULL); /* user_data */
+
+		//g_timeout_add(poll_interval, poll_sensor, object);
+
+		/* Export the object (@manager takes its own reference to @object) */
+		g_dbus_object_manager_server_set_connection(manager, connection);
+		g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+		g_object_unref(object);
+	}
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//g_print ("Acquired the name %s\n", name);
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//g_print ("Lost the name %s\n", name);
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
index 89ddc4e..f865be1 100644
--- a/objects/flash_bios_obj.c
+++ b/objects/flash_bios_obj.c
@@ -1,447 +1,391 @@
-#include <stdio.h>

-#include <stdbool.h>

-#include <string.h>

-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/control/flash";

-static const gchar* dbus_name        = "org.openbmc.control.Flash";

-static const gchar* FLASHER_BIN      = "flasher.exe";

-static const gchar* DLOAD_BUS = "org.openbmc.managers.Download";

-static const gchar* DLOAD_OBJ = "/org/openbmc/managers/Download";

-

-static GDBusObjectManagerServer *manager = NULL;

-

-void catch_child(int sig_num)

-{

-    /* when we get here, we know there's a zombie child waiting */

-    int child_status;

-

-    wait(&child_status);

-    printf("flasher exited.\n");

-}

-

-

-int update(Flash* flash, const char* obj_path)

-{

-	pid_t pid;

-	int status=-1;

-	pid = fork();

-	if (pid == 0)

-	{

-		const gchar* path = flash_get_flasher_path(flash);

-		const gchar* name = flash_get_flasher_name(flash);

-		const gchar* inst = flash_get_flasher_instance(flash);

-		const gchar* filename = flash_get_filename(flash);

-		status = execl(path, name, inst, filename, obj_path, NULL);

-		return status;

-	}

-	return 0;

-}

-

-static gboolean

-on_init (Flash          *f,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	flash_complete_init(f,invocation);

-

-	//tune flash

-	if (strcmp(flash_get_flasher_instance(f),"bios") == 0)

-	{

-		flash_set_filename(f,"");

-		const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);

-		int rc = update(f,obj_path);

-		if (rc==-1)

-		{

-			printf("ERROR FlashControl: Unable to init\n");

-		}

-		sleep(3);

-		rc = update(f,obj_path);

-		

-	}

-	return TRUE;

-}

-

-static gboolean

-on_lock (SharedResource          *lock,

-                GDBusMethodInvocation  *invocation,

-		gchar*                  name,

-                gpointer                user_data)

-{

-	gboolean locked = shared_resource_get_lock(lock);

-	if (locked)

-	{

-		const gchar* name = shared_resource_get_name(lock);

-		printf("ERROR: BIOS Flash is already locked: %s\n",name);

-	}

-	else

-	{	

-		printf("Locking BIOS Flash: %s\n",name);

-		shared_resource_set_lock(lock,true);

-		shared_resource_set_name(lock,name);

-	}

-	shared_resource_complete_lock(lock,invocation);

-	return TRUE;

-}

-static gboolean

-on_is_locked (SharedResource          *lock,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	gboolean locked = shared_resource_get_lock(lock);

-	const gchar* name = shared_resource_get_name(lock);

-	shared_resource_complete_is_locked(lock,invocation,locked,name);

-	return TRUE;

-}

-

-

-static gboolean

-on_unlock (SharedResource          *lock,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	printf("Unlocking BIOS Flash\n");

-	shared_resource_set_lock(lock,false);

-	shared_resource_set_name(lock,"");

-	shared_resource_complete_unlock(lock,invocation);

-	return TRUE;

-}

-

-static gboolean

-on_update_via_tftp (Flash          *flash,

-                GDBusMethodInvocation  *invocation,

-                gchar*                  url,

-                gchar*                  write_file,

-                gpointer                user_data)

-{

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	gboolean locked = shared_resource_get_lock(lock);

-	flash_complete_update_via_tftp(flash,invocation);

-	if (locked)

-	{

-		const gchar* name = shared_resource_get_name(lock);

-		printf("BIOS Flash is locked: %s\n",name);

-	}

-	else

-	{	

-		printf("Flashing BIOS from TFTP: %s,%s\n",url,write_file);

-		flash_set_filename(flash,write_file);

-		flash_emit_download(flash,url,write_file);

-		flash_set_status(flash,"Downloading");

-	}

-	return TRUE;

-}

-

-static gboolean

-on_error        (Flash          *flash,

-                GDBusMethodInvocation  *invocation,

-                gchar*                  error_msg,

-                gpointer                user_data)

-{

-	int rc = 0;

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	gboolean locked = shared_resource_get_lock(lock);

-	flash_set_status(flash, error_msg);

-	flash_complete_error(flash,invocation);

-	printf("ERROR: %s.  Clearing locks\n",error_msg);

-	shared_resource_set_lock(lock,false);

-	shared_resource_set_name(lock,"");

-	

-	return TRUE;

-}

-static gboolean

-on_done        (Flash          *flash,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	int rc = 0;

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	gboolean locked = shared_resource_get_lock(lock);

-	flash_set_status(flash, "Flash Done");

-	flash_complete_done(flash,invocation);

-	printf("Flash Done. Clearing locks\n");

-	shared_resource_set_lock(lock,false);

-	shared_resource_set_name(lock,"");

-	const gchar* filename = flash_get_filename(flash);

-	rc = unlink(filename);

-	if (rc != 0 )

-	{

-		printf("ERROR: Unable to delete file %s (%d)\n",filename,rc);

-	}

-	

-	return TRUE;

-}

-

-

-static gboolean

-on_update (Flash          *flash,

-                GDBusMethodInvocation  *invocation,

-                gchar*                  write_file,

-                gpointer                user_data)

-{

-	int rc = 0;

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	gboolean locked = shared_resource_get_lock(lock);

-	flash_set_status(flash,"Flashing");

-	flash_complete_update(flash,invocation);

-	if (locked)

-	{

-		const gchar* name = shared_resource_get_name(lock);

-		printf("BIOS Flash is locked: %s\n",name);

-	}

-	else

-	{	

-		printf("Flashing BIOS from: %s\n",write_file);

-		flash_set_status(flash, "Flashing");

-		shared_resource_set_lock(lock,true);

-		shared_resource_set_name(lock,dbus_object_path);

-		flash_set_filename(flash,write_file);

-		const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);

-		rc = update(flash,obj_path);

-		if (!rc)

-		{

-			shared_resource_set_lock(lock,false);

-			shared_resource_set_name(lock,"");

-		}

-	}

-	return TRUE;

-}

-static void

-on_flash_progress (GDBusConnection* connection,

-               const gchar* sender_name,

-               const gchar* object_path,

-               const gchar* interface_name,

-               const gchar* signal_name,

-               GVariant* parameters,

-               gpointer user_data) 

-{

-	Flash *flash = object_get_flash((Object*)user_data);

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	GVariantIter *iter = g_variant_iter_new(parameters);

-	GVariant* v_filename = g_variant_iter_next_value(iter);

-	GVariant* v_progress = g_variant_iter_next_value(iter);

-	

-	uint8_t progress = g_variant_get_byte(v_progress);

-

-	gchar *s;

-	s = g_strdup_printf ("Flashing: %d%%",progress);

-	flash_set_status(flash,s);

-	g_free(s);

-}

-

-static void

-on_flash_done (GDBusConnection* connection,

-               const gchar* sender_name,

-               const gchar* object_path,

-               const gchar* interface_name,

-               const gchar* signal_name,

-               GVariant* parameters,

-               gpointer user_data) 

-{

-	Flash *flash = object_get_flash((Object*)user_data);

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	printf("Flash succeeded; unlocking flash\n");

-	shared_resource_set_lock(lock,false);

-	shared_resource_set_name(lock,"");

-	flash_set_status(flash,"Flash Done");

-}

-

-static void

-on_flash_error (GDBusConnection* connection,

-               const gchar* sender_name,

-               const gchar* object_path,

-               const gchar* interface_name,

-               const gchar* signal_name,

-               GVariant* parameters,

-               gpointer user_data) 

-{

-	Flash *flash = object_get_flash((Object*)user_data);

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	printf("Flash Error; unlocking flash\n");

-	shared_resource_set_lock(lock,false);

-	shared_resource_set_name(lock,"");

-}

-

-static void

-on_download_error (GDBusConnection* connection,

-               const gchar* sender_name,

-               const gchar* object_path,

-               const gchar* interface_name,

-               const gchar* signal_name,

-               GVariant* parameters,

-               gpointer user_data) 

-{

-	Flash *flash = object_get_flash((Object*)user_data);

-	SharedResource *lock = object_get_shared_resource((Object*)user_data);

-	printf("ERROR: FlashBios:  Download error; clearing flash lock\n");

-	shared_resource_set_lock(lock,false);

-	shared_resource_set_name(lock,"");

-}

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

- 	cmdline *cmd = user_data;

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-  	int i=0;

-

-	//TODO: don't use fixed buffer

-	char flasher_path[512];

-	memset(flasher_path, '\0', sizeof(flasher_path));

-	bool found = false;

-	gchar *flasher_file;

-	int c = strlen(cmd->argv[0]);

-	while(c>0)

-	{

-		if (cmd->argv[0][c] == '/')

-		{

-			strncpy(flasher_path,cmd->argv[0],c);

-			flasher_file = g_strdup_printf ("%s/%s",flasher_path,FLASHER_BIN);

-			break;

-		}

-		c--;

-	}

-

-	const char* inst[] = {"bios"};

-  	for (i=0;i<1;i++)

-  	{

-		gchar* s;

-		s = g_strdup_printf ("%s/%s",dbus_object_path,inst[i]);

-		object = object_skeleton_new (s);

-		g_free (s);

-

-		Flash* flash = flash_skeleton_new ();

-		object_skeleton_set_flash (object, flash);

- 		g_object_unref (flash);

-

-		SharedResource* lock = shared_resource_skeleton_new ();

-		object_skeleton_set_shared_resource (object, lock);

- 		g_object_unref (lock);

-

-		ObjectMapper* mapper = object_mapper_skeleton_new ();

-		object_skeleton_set_object_mapper (object, mapper);

-		g_object_unref (mapper);

-

-		shared_resource_set_lock(lock,false);

-		shared_resource_set_name(lock,"");

-

-		flash_set_flasher_path(flash,flasher_file);

-		flash_set_flasher_name(flash,FLASHER_BIN);

-		flash_set_flasher_instance(flash,inst[i]);

-		//g_free (s);

-

-

-		//define method callbacks here

-		g_signal_connect (lock,

-                    "handle-lock",

-                    G_CALLBACK (on_lock),

-                    NULL); /* user_data */

-		g_signal_connect (lock,

-                    "handle-unlock",

-                    G_CALLBACK (on_unlock),

-                    NULL); /* user_data */

-		g_signal_connect (lock,

-                    "handle-is-locked",

-                    G_CALLBACK (on_is_locked),

-                    NULL); /* user_data */

-

-		g_signal_connect (flash,

-                    "handle-update",

-                    G_CALLBACK (on_update),

-                    object); /* user_data */

-

-		g_signal_connect (flash,

-                    "handle-error",

-                    G_CALLBACK (on_error),

-                    object); /* user_data */

-

-		g_signal_connect (flash,

-                    "handle-done",

-                    G_CALLBACK (on_done),

-                    object); /* user_data */

-

-		g_signal_connect (flash,

-                    "handle-update-via-tftp",

-                    G_CALLBACK (on_update_via_tftp),

-                    object); /* user_data */

-

-		g_signal_connect (flash,

-                    "handle-init",

-                    G_CALLBACK (on_init),

-                    object); /* user_data */

-

-		s = g_strdup_printf ("/org/openbmc/control/%s",inst[i]);

-		g_dbus_connection_signal_subscribe(connection,

-                                   NULL,

-                                   "org.openbmc.FlashControl",

-                                   "Progress",

-                                   s,

-                                   NULL,

-                                   G_DBUS_SIGNAL_FLAGS_NONE,

-                                   (GDBusSignalCallback) on_flash_progress,

-                                   object,

-                                   NULL );

-

-		g_free (s);

-

- 

-		flash_set_filename(flash,"");

-		/* Export the object (@manager takes its own reference to @object) */

-		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-  		g_object_unref (object);

-	}

-	g_free(flasher_file);

-	/* Export all objects */

-	g_dbus_object_manager_server_set_connection (manager, connection);

-	emit_object_added((GDBusObjectManager*)manager); 

-}

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-//  g_print ("Acquired the name %s\n", name);

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-  //g_print ("Lost the name %s\n", name);

-}

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  //signal(SIGCHLD, catch_child);

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/control/flash";
+static const gchar* dbus_name = "org.openbmc.control.Flash";
+static const gchar* FLASHER_BIN = "flasher.exe";
+
+static GDBusObjectManagerServer *manager = NULL;
+
+void
+catch_child(int sig_num)
+{
+	/* when we get here, we know there's a zombie child waiting */
+	int child_status;
+
+	wait(&child_status);
+	printf("flasher exited.\n");
+}
+
+int
+update(Flash* flash, const char* obj_path)
+{
+	pid_t pid;
+	int status=-1;
+	pid = fork();
+	if(pid == 0)
+	{
+		const gchar* path = flash_get_flasher_path(flash);
+		const gchar* name = flash_get_flasher_name(flash);
+		const gchar* inst = flash_get_flasher_instance(flash);
+		const gchar* filename = flash_get_filename(flash);
+		status = execl(path, name, inst, filename, obj_path, NULL);
+		return status;
+	}
+	return 0;
+}
+
+static gboolean
+on_init(Flash *f,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	flash_complete_init(f,invocation);
+
+	//tune flash
+	if(strcmp(flash_get_flasher_instance(f),"bios") == 0)
+	{
+		flash_set_filename(f,"");
+		const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);
+		int rc = update(f,obj_path);
+		if(rc==-1)
+		{
+			printf("ERROR FlashControl: Unable to init\n");
+		}
+		sleep(3);
+		rc = update(f,obj_path);
+
+	}
+	return TRUE;
+}
+
+static gboolean
+on_lock(SharedResource *lock,
+		GDBusMethodInvocation *invocation,
+		gchar* name,
+		gpointer user_data)
+{
+	gboolean locked = shared_resource_get_lock(lock);
+	if(locked)
+	{
+		const gchar* name = shared_resource_get_name(lock);
+		printf("ERROR: BIOS Flash is already locked: %s\n",name);
+	}
+	else
+	{
+		printf("Locking BIOS Flash: %s\n",name);
+		shared_resource_set_lock(lock,true);
+		shared_resource_set_name(lock,name);
+	}
+	shared_resource_complete_lock(lock,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_is_locked(SharedResource *lock,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	gboolean locked = shared_resource_get_lock(lock);
+	const gchar* name = shared_resource_get_name(lock);
+	shared_resource_complete_is_locked(lock,invocation,locked,name);
+	return TRUE;
+}
+
+static gboolean
+on_unlock(SharedResource *lock,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	printf("Unlocking BIOS Flash\n");
+	shared_resource_set_lock(lock,false);
+	shared_resource_set_name(lock,"");
+	shared_resource_complete_unlock(lock,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_update_via_tftp(Flash *flash,
+		GDBusMethodInvocation *invocation,
+		gchar* url,
+		gchar* write_file,
+		gpointer user_data)
+{
+	SharedResource *lock = object_get_shared_resource((Object*)user_data);
+	gboolean locked = shared_resource_get_lock(lock);
+	flash_complete_update_via_tftp(flash,invocation);
+	if(locked)
+	{
+		const gchar* name = shared_resource_get_name(lock);
+		printf("BIOS Flash is locked: %s\n",name);
+	}
+	else
+	{
+		printf("Flashing BIOS from TFTP: %s,%s\n",url,write_file);
+		flash_set_filename(flash,write_file);
+		flash_emit_download(flash,url,write_file);
+		flash_set_status(flash,"Downloading");
+	}
+	return TRUE;
+}
+
+static gboolean
+on_error(Flash *flash,
+		GDBusMethodInvocation *invocation,
+		gchar* error_msg,
+		gpointer user_data)
+{
+	SharedResource *lock = object_get_shared_resource((Object*)user_data);
+	shared_resource_get_lock(lock);
+	flash_set_status(flash, error_msg);
+	flash_complete_error(flash,invocation);
+	printf("ERROR: %s.  Clearing locks\n",error_msg);
+	shared_resource_set_lock(lock,false);
+	shared_resource_set_name(lock,"");
+
+	return TRUE;
+}
+
+static gboolean
+on_done(Flash *flash,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	int rc = 0;
+	SharedResource *lock = object_get_shared_resource((Object*)user_data);
+	shared_resource_get_lock(lock);
+	flash_set_status(flash, "Flash Done");
+	flash_complete_done(flash,invocation);
+	printf("Flash Done. Clearing locks\n");
+	shared_resource_set_lock(lock,false);
+	shared_resource_set_name(lock,"");
+	const gchar* filename = flash_get_filename(flash);
+	rc = unlink(filename);
+	if(rc != 0 )
+	{
+		printf("ERROR: Unable to delete file %s (%d)\n",filename,rc);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+on_update(Flash *flash,
+		GDBusMethodInvocation *invocation,
+		gchar* write_file,
+		gpointer user_data)
+{
+	int rc = 0;
+	SharedResource *lock = object_get_shared_resource((Object*)user_data);
+	gboolean locked = shared_resource_get_lock(lock);
+	flash_set_status(flash,"Flashing");
+	flash_complete_update(flash,invocation);
+	if(locked)
+	{
+		const gchar* name = shared_resource_get_name(lock);
+		printf("BIOS Flash is locked: %s\n",name);
+	}
+	else
+	{
+		printf("Flashing BIOS from: %s\n",write_file);
+		flash_set_status(flash, "Flashing");
+		shared_resource_set_lock(lock,true);
+		shared_resource_set_name(lock,dbus_object_path);
+		flash_set_filename(flash,write_file);
+		const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);
+		rc = update(flash,obj_path);
+		if(!rc)
+		{
+			shared_resource_set_lock(lock,false);
+			shared_resource_set_name(lock,"");
+		}
+	}
+	return TRUE;
+}
+
+static void
+on_flash_progress(GDBusConnection* connection,
+		const gchar* sender_name,
+		const gchar* object_path,
+		const gchar* interface_name,
+		const gchar* signal_name,
+		GVariant* parameters,
+		gpointer user_data)
+{
+	Flash *flash = object_get_flash((Object*)user_data);
+	object_get_shared_resource((Object*)user_data);
+	GVariantIter *iter = g_variant_iter_new(parameters);
+	g_variant_iter_next_value(iter);
+	GVariant* v_progress = g_variant_iter_next_value(iter);
+
+	uint8_t progress = g_variant_get_byte(v_progress);
+
+	gchar *s;
+	s = g_strdup_printf("Flashing: %d%%",progress);
+	flash_set_status(flash,s);
+	g_free(s);
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+	cmdline *cmd = user_data;
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	int i=0;
+
+	//TODO: don't use fixed buffer
+	char flasher_path[512];
+	memset(flasher_path, '\0', sizeof(flasher_path));
+	gchar *flasher_file = NULL;
+	int c = strlen(cmd->argv[0]);
+	while(c>0)
+	{
+		if(cmd->argv[0][c] == '/')
+		{
+			strncpy(flasher_path,cmd->argv[0],c);
+			flasher_file = g_strdup_printf("%s/%s",flasher_path,FLASHER_BIN);
+			break;
+		}
+		c--;
+	}
+
+	const char* inst[] = {"bios"};
+	for(i=0;i<1;i++)
+	{
+		gchar* s;
+		s = g_strdup_printf("%s/%s",dbus_object_path,inst[i]);
+		object = object_skeleton_new(s);
+		g_free(s);
+
+		Flash* flash = flash_skeleton_new();
+		object_skeleton_set_flash(object, flash);
+		g_object_unref(flash);
+
+		SharedResource* lock = shared_resource_skeleton_new();
+		object_skeleton_set_shared_resource(object, lock);
+		g_object_unref(lock);
+
+		shared_resource_set_lock(lock,false);
+		shared_resource_set_name(lock,"");
+
+		flash_set_flasher_path(flash,flasher_file);
+		flash_set_flasher_name(flash,FLASHER_BIN);
+		flash_set_flasher_instance(flash,inst[i]);
+		//g_free (s);
+
+
+		//define method callbacks here
+		g_signal_connect(lock,
+				"handle-lock",
+				G_CALLBACK(on_lock),
+				NULL); /* user_data */
+		g_signal_connect(lock,
+				"handle-unlock",
+				G_CALLBACK(on_unlock),
+				NULL); /* user_data */
+		g_signal_connect(lock,
+				"handle-is-locked",
+				G_CALLBACK(on_is_locked),
+				NULL); /* user_data */
+
+		g_signal_connect(flash,
+				"handle-update",
+				G_CALLBACK(on_update),
+				object); /* user_data */
+
+		g_signal_connect(flash,
+				"handle-error",
+				G_CALLBACK(on_error),
+				object); /* user_data */
+
+		g_signal_connect(flash,
+				"handle-done",
+				G_CALLBACK(on_done),
+				object); /* user_data */
+
+		g_signal_connect(flash,
+				"handle-update-via-tftp",
+				G_CALLBACK(on_update_via_tftp),
+				object); /* user_data */
+
+		g_signal_connect(flash,
+				"handle-init",
+				G_CALLBACK(on_init),
+				object); /* user_data */
+
+		s = g_strdup_printf("/org/openbmc/control/%s",inst[i]);
+		g_dbus_connection_signal_subscribe(connection,
+				NULL,
+				"org.openbmc.FlashControl",
+				"Progress",
+				s,
+				NULL,
+				G_DBUS_SIGNAL_FLAGS_NONE,
+				(GDBusSignalCallback) on_flash_progress,
+				object,
+				NULL );
+
+		g_free(s);
+
+
+		flash_set_filename(flash,"");
+		/* Export the object (@manager takes its own reference to @object) */
+		g_dbus_object_manager_server_set_connection(manager, connection);
+		g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+		g_object_unref(object);
+	}
+	g_free(flasher_file);
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//  g_print ("Acquired the name %s\n", name);
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//g_print ("Lost the name %s\n", name);
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	//signal(SIGCHLD, catch_child);
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/flasher_obj.c b/objects/flasher_obj.c
index 2c46760..56ca61f 100644
--- a/objects/flasher_obj.c
+++ b/objects/flasher_obj.c
@@ -1,457 +1,420 @@
-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <fcntl.h>

-#include <sys/mman.h>

-#include <sys/types.h>

-#include <sys/stat.h>

-#include <unistd.h>

-#include <byteswap.h>

-#include <stdint.h>

-#include <stdbool.h>

-#include <getopt.h>

-#include <limits.h>

-#include <arpa/inet.h>

-#include <assert.h>

-

-#include <libflash/libflash.h>

-#include <libflash/libffs.h>

-#include "progress.h"

-#include "io.h"

-#include "ast.h"

-#include "sfc-ctrl.h"

-#include "interfaces/openbmc_intf.h"

-#include "includes/openbmc.h"

-

-static const gchar* dbus_object_path = "/org/openbmc/control";

-static const gchar* dbus_object_name = "Flasher_0";

-static const gchar* dbus_name        = "org.openbmc.control.Flasher";

-

-static GDBusObjectManagerServer *manager = NULL;

-

-#define __aligned(x)			__attribute__((aligned(x)))

-

-#define PFLASH_VERSION	"0.8.6"

-

-static bool must_confirm = false;

-static bool dummy_run;

-static bool need_relock;

-static bool bmc_flash;

-#ifdef __powerpc__

-static bool using_sfc;

-#endif

-

-#define FILE_BUF_SIZE	0x10000

-static uint8_t file_buf[FILE_BUF_SIZE] __aligned(0x1000);

-

-static struct spi_flash_ctrl	*fl_ctrl;

-static struct flash_chip	*fl_chip;

-static struct ffs_handle	*ffsh;

-static uint32_t			fl_total_size, fl_erase_granule;

-static const char		*fl_name;

-static int32_t			ffs_index = -1;

-

-static uint8_t FLASH_OK = 0;

-static uint8_t FLASH_ERROR = 0x01;

-static uint8_t FLASH_SETUP_ERROR = 0x02;

-static struct blocklevel_device *bl;

-

-static int erase_chip(void)

-{

-	int rc = 0;

-

-	printf("Erasing... (may take a while !) ");

-	fflush(stdout);

-

-	rc = flash_erase_chip(fl_chip);

-	if (rc) {

-		fprintf(stderr, "Error %d erasing chip\n", rc);

-		return(rc);

-	}

-

-	printf("done !\n");

-	return (rc);

-}

-

-

-void flash_message(GDBusConnection* connection,char* obj_path,char* method, char* error_msg)

-{

-	GDBusProxy *proxy;

- 	GError *error;

-	GVariant *parm = NULL;

-	GVariant *result;

-	error = NULL;

-	proxy = g_dbus_proxy_new_sync (connection,

-                             G_DBUS_PROXY_FLAGS_NONE,

-                             NULL,                      /* GDBusInterfaceInfo* */

-                             "org.openbmc.control.Flash", /* name */

-                             obj_path, /* object path */

-                             "org.openbmc.Flash",        /* interface name */

-                             NULL,                      /* GCancellable */

-                             &error);

-	g_assert_no_error (error);

-

-	error = NULL;

-	if (strcmp(method,"error")==0) {

-		parm = g_variant_new("(s)",error_msg);

-	}

-	result = g_dbus_proxy_call_sync (proxy,

-                                   method,

-				   parm,

-                                   G_DBUS_CALL_FLAGS_NONE,

-                                   -1,

-                                   NULL,

-                                   &error);

-

-	g_assert_no_error (error);

-}

-

-

-static int program_file(FlashControl* flash_control, const char *file, uint32_t start, uint32_t size)

-{

-	int fd, rc;

-	ssize_t len;

-	uint32_t actual_size = 0;

-

-	fd = open(file, O_RDONLY);

-	if (fd == -1) {

-		perror("Failed to open file");

-		return(fd);

-	}

-	printf("About to program \"%s\" at 0x%08x..0x%08x !\n",

-	       file, start, size);

-

-	printf("Programming & Verifying...\n");

-	//progress_init(size >> 8);

-	unsigned int save_size = size;

-	uint8_t last_progress = 0;

-	while(size) {

-		len = read(fd, file_buf, FILE_BUF_SIZE);

-		if (len < 0) {

-			perror("Error reading file");

-			return(1);

-		}

-		if (len == 0)

-			break;

-		if (len > size)

-			len = size;

-		size -= len;

-		actual_size += len;

-		rc = flash_write(fl_chip, start, file_buf, len, true);

-		if (rc) {

-			if (rc == FLASH_ERR_VERIFY_FAILURE)

-				fprintf(stderr, "Verification failed for"

-					" chunk at 0x%08x\n", start);

-			else

-				fprintf(stderr, "Flash write error %d for"

-					" chunk at 0x%08x\n", rc, start);

-			return(rc);

-		}

-		start += len;

-		unsigned int percent = (100*actual_size/save_size);

-		uint8_t progress = (uint8_t) (percent);

-		if (progress != last_progress) {

-			flash_control_emit_progress(flash_control,file,progress);

-			last_progress = progress;

-		}

-	}

-	close(fd);

-

-	/* If this is a flash partition, adjust its size */

-	if (ffsh && ffs_index >= 0) {

-		printf("Updating actual size in partition header...\n");

-		ffs_update_act_size(ffsh, ffs_index, actual_size);

-	}

-	return(0);

-}

-

-static void do_read_file(const char *file, uint32_t start, uint32_t size)

-{

-	int fd, rc;

-	ssize_t len;

-	uint32_t done = 0;

-

-	fd = open(file, O_WRONLY | O_TRUNC | O_CREAT, 00666);

-	if (fd == -1) {

-		perror("Failed to open file");

-		exit(1);

-	}

-	printf("Reading to \"%s\" from 0x%08x..0x%08x !\n",

-	       file, start, size);

-

-	progress_init(size >> 8);

-	while(size) {

-		len = size > FILE_BUF_SIZE ? FILE_BUF_SIZE : size;

-		rc = flash_read(fl_chip, start, file_buf, len);

-		if (rc) {

-			fprintf(stderr, "Flash read error %d for"

-				" chunk at 0x%08x\n", rc, start);

-			exit(1);

-		}

-		rc = write(fd, file_buf, len);

-		if (rc < 0) {

-			perror("Error writing file");

-			exit(1);

-		}

-		start += len;

-		size -= len;

-		done += len;

-		progress_tick(done >> 8);

-	}

-	progress_end();

-	close(fd);

-}

-static void flash_access_cleanup_bmc(void)

-{

-	if (ffsh)

-		ffs_close(ffsh);

-	flash_exit(fl_chip);

-	ast_sf_close(fl_ctrl);

-	close_devs();

-}

-

-static int flash_access_setup_bmc(bool use_lpc, bool need_write)

-{

-	int rc;

-	printf("Setting up BMC flash\n");

-	/* Open and map devices */

-	open_devs(use_lpc, true);

-

-	/* Create the AST flash controller */

-	rc = ast_sf_open(AST_SF_TYPE_BMC, &fl_ctrl);

-	if (rc) {

-		fprintf(stderr, "Failed to open controller\n");

-		return FLASH_SETUP_ERROR;

-	}

-

-	/* Open flash chip */

-	rc = flash_init(fl_ctrl, &fl_chip);

-	if (rc) {

-		fprintf(stderr, "Failed to open flash chip\n");

-		return FLASH_SETUP_ERROR;

-	}

-

-	/* Setup cleanup function */

-	atexit(flash_access_cleanup_bmc);

-	return FLASH_OK;

-}

-

-static void flash_access_cleanup_pnor(void)

-{

-	/* Re-lock flash */

-	if (need_relock)

-		set_wrprotect(true);

-

-	if (ffsh)

-		ffs_close(ffsh);

-	flash_exit(fl_chip);

-#ifdef __powerpc__

-	if (using_sfc)

-		sfc_close(fl_ctrl);

-	else

-		ast_sf_close(fl_ctrl);

-#else

-	ast_sf_close(fl_ctrl);

-#endif

-	close_devs();

-}

-

-static int flash_access_setup_pnor(bool use_lpc, bool use_sfc, bool need_write)

-{

-	int rc;

-	printf("Setting up BIOS flash\n");

-

-	/* Open and map devices */

-	open_devs(use_lpc, false);

-

-#ifdef __powerpc__

-	if (use_sfc) {

-		/* Create the SFC flash controller */

-		rc = sfc_open(&fl_ctrl);

-		if (rc) {

-			fprintf(stderr, "Failed to open controller\n");

-			return FLASH_SETUP_ERROR;

-		}

-		using_sfc = true;

-	} else {

-#endif			

-		/* Create the AST flash controller */

-		rc = ast_sf_open(AST_SF_TYPE_PNOR, &fl_ctrl);

-		if (rc) {

-			fprintf(stderr, "Failed to open controller\n");

-			return FLASH_SETUP_ERROR;

-		}

-#ifdef __powerpc__

-	}

-#endif

-

-	/* Open flash chip */

-	rc = flash_init(fl_ctrl, &fl_chip);

-	if (rc) {

-		fprintf(stderr, "Failed to open flash chip\n");

-		return FLASH_SETUP_ERROR;

-	}

-

-	/* Unlock flash (PNOR only) */

-	if (need_write)

-		need_relock = set_wrprotect(false);

-

-	/* Setup cleanup function */

-	atexit(flash_access_cleanup_pnor);

-	return FLASH_OK;

-}

-

-uint8_t flash(FlashControl* flash_control,bool bmc_flash, uint32_t address, char* write_file, char* obj_path)

-{

-	bool has_sfc = false, has_ast = false, use_lpc = true;

-	bool erase = true, program = true;

-

-	int rc;

-	printf("flasher: %s, BMC = %d, address = 0x%x\n",write_file,bmc_flash,address);

-#ifdef __arm__

-	/* Check platform */

-	check_platform(&has_sfc, &has_ast);

-

-	/* Prepare for access */

-	if (bmc_flash) {

-		if (!has_ast) {

-			fprintf(stderr, "No BMC on this platform\n");

-			return FLASH_SETUP_ERROR;

-		}

-		rc = flash_access_setup_bmc(use_lpc, erase || program);

-		if (rc) {

-			return FLASH_SETUP_ERROR;

-		}

-	} else {

-		if (!has_ast && !has_sfc) {

-			fprintf(stderr, "No BMC nor SFC on this platform\n");

-			return FLASH_SETUP_ERROR;

-		}

-		rc = flash_access_setup_pnor(use_lpc, has_sfc, erase || program);

-		if (rc) {

-			return FLASH_SETUP_ERROR;

-		}

-	}

-

-	rc = flash_get_info(fl_chip, &fl_name,

-			    &fl_total_size, &fl_erase_granule);

-	if (rc) {

-		fprintf(stderr, "Error %d getting flash info\n", rc);

-		return FLASH_SETUP_ERROR;

-	}

-#endif

-	if (strcmp(write_file,"")!=0)

-	{

-		// If file specified but not size, get size from file

-		struct stat stbuf;

-		if (stat(write_file, &stbuf)) {

-			perror("Failed to get file size");

-			return FLASH_ERROR;

-		}

-		uint32_t write_size = stbuf.st_size;

-#ifdef __arm__

-		rc = erase_chip();

-		if (rc) {

-			return FLASH_ERROR;

-		}

-		rc = program_file(flash_control, write_file, address, write_size);

-		if (rc) {

-			return FLASH_ERROR;

-		}

-#endif

-	

-		printf("Flash done\n");

-	}

-	else 

-	{

-		printf("Flash tuned\n");

-	}

-	return FLASH_OK;

-}

-

-static void

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-

-	cmdline *cmd = user_data;

-	if (cmd->argc < 4)

-	{

-		g_print("flasher [flash name] [filename] [source object]\n");

-		g_main_loop_quit(cmd->loop);

-		return;

-	}

-	printf("Starting flasher: %s,%s,%s,\n",cmd->argv[1],cmd->argv[2],cmd->argv[3]);	

-	ObjectSkeleton *object;

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-	gchar *s;

-	s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[1]);

-

-	object = object_skeleton_new (s);

-	g_free (s);

-

-	FlashControl* flash_control = flash_control_skeleton_new ();

-	object_skeleton_set_flash_control (object, flash_control);

-	g_object_unref (flash_control);

-

-	/* Export the object (@manager takes its own reference to @object) */

-	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-	g_object_unref (object);

-

-	/* Export all objects */

-	g_dbus_object_manager_server_set_connection (manager, connection);

-	bool bmc_flash = false;

-	uint32_t address = 0;

-	if (strcmp(cmd->argv[1],"bmc")==0) {

-		bmc_flash = true;

-	}

-	if (strcmp(cmd->argv[1],"bmc_ramdisk")==0) {

-		bmc_flash = true;

-		address = 0x20300000;

-	}

-	if (strcmp(cmd->argv[1],"bmc_kernel")==0) {

-		bmc_flash = true;

-		address = 0x20080000;

-	}

-

-	int rc = flash(flash_control,bmc_flash,address,cmd->argv[2],cmd->argv[3]);

-	if (rc) {

-		flash_message(connection,cmd->argv[3],"error","Flash Error");

-	} else {

-		flash_message(connection,cmd->argv[3],"done","");

-	}

-

-	//Object exits when done flashing	

-	g_main_loop_quit(cmd->loop);

-}

-

-int main(int argc, char *argv[])

-{

-

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-  cmd.loop = loop;

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       NULL,

-                       NULL,

-                       &cmd,

-                       NULL);

-

-   g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-

-	return 0;

-}

+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <byteswap.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <getopt.h>
+#include <limits.h>
+#include <arpa/inet.h>
+#include <assert.h>
+
+#include <libflash/libflash.h>
+#include <libflash/libffs.h>
+#include "progress.h"
+#include "io.h"
+#include "ast.h"
+#include "sfc-ctrl.h"
+#include "interfaces/openbmc_intf.h"
+#include "includes/openbmc.h"
+
+static const gchar* dbus_object_path = "/org/openbmc/control";
+static const gchar* dbus_name = "org.openbmc.control.Flasher";
+
+static GDBusObjectManagerServer *manager = NULL;
+
+#define __aligned(x)			__attribute__((aligned(x)))
+
+#define PFLASH_VERSION	"0.8.6"
+
+static bool need_relock;
+#ifdef __powerpc__
+static bool using_sfc;
+#endif
+
+#define FILE_BUF_SIZE	0x10000
+static uint8_t file_buf[FILE_BUF_SIZE] __aligned(0x1000);
+
+static struct spi_flash_ctrl	*fl_ctrl;
+static struct flash_chip	*fl_chip;
+static struct ffs_handle	*ffsh;
+static uint32_t			fl_total_size, fl_erase_granule;
+static const char		*fl_name;
+static int32_t			ffs_index = -1;
+
+static uint8_t FLASH_OK = 0;
+static uint8_t FLASH_ERROR = 0x01;
+static uint8_t FLASH_SETUP_ERROR = 0x02;
+
+static int
+erase_chip(void)
+{
+	int rc = 0;
+
+	printf("Erasing... (may take a while !) ");
+	fflush(stdout);
+
+	rc = flash_erase_chip(fl_chip);
+	if(rc) {
+		fprintf(stderr, "Error %d erasing chip\n", rc);
+		return(rc);
+	}
+
+	printf("done !\n");
+	return(rc);
+}
+
+void
+flash_message(GDBusConnection* connection,char* obj_path,char* method, char* error_msg)
+{
+	GDBusProxy *proxy;
+	GError *error;
+	GVariant *parm = NULL;
+	error = NULL;
+	proxy = g_dbus_proxy_new_sync(connection,
+			G_DBUS_PROXY_FLAGS_NONE,
+			NULL, /* GDBusInterfaceInfo* */
+			"org.openbmc.control.Flash", /* name */
+			obj_path, /* object path */
+			"org.openbmc.Flash", /* interface name */
+			NULL, /* GCancellable */
+			&error);
+	g_assert_no_error(error);
+
+	error = NULL;
+	if(strcmp(method,"error")==0) {
+		parm = g_variant_new("(s)",error_msg);
+	}
+	g_dbus_proxy_call_sync(proxy,
+			method,
+			parm,
+			G_DBUS_CALL_FLAGS_NONE,
+			-1,
+			NULL,
+			&error);
+
+	g_assert_no_error(error);
+}
+
+static int
+program_file(FlashControl* flash_control, const char *file, uint32_t start, uint32_t size)
+{
+	int fd, rc;
+	ssize_t len;
+	uint32_t actual_size = 0;
+
+	fd = open(file, O_RDONLY);
+	if(fd == -1) {
+		perror("Failed to open file");
+		return(fd);
+	}
+	printf("About to program \"%s\" at 0x%08x..0x%08x !\n",
+			file, start, size);
+
+	printf("Programming & Verifying...\n");
+	//progress_init(size >> 8);
+	unsigned int save_size = size;
+	uint8_t last_progress = 0;
+	while(size) {
+		len = read(fd, file_buf, FILE_BUF_SIZE);
+		if(len < 0) {
+			perror("Error reading file");
+			return(1);
+		}
+		if(len == 0)
+			break;
+		if(len > size)
+			len = size;
+		size -= len;
+		actual_size += len;
+		rc = flash_write(fl_chip, start, file_buf, len, true);
+		if(rc) {
+			if(rc == FLASH_ERR_VERIFY_FAILURE)
+				fprintf(stderr, "Verification failed for"
+						" chunk at 0x%08x\n", start);
+			else
+				fprintf(stderr, "Flash write error %d for"
+						" chunk at 0x%08x\n", rc, start);
+			return(rc);
+		}
+		start += len;
+		unsigned int percent = (100*actual_size/save_size);
+		uint8_t progress = (uint8_t)(percent);
+		if(progress != last_progress) {
+			flash_control_emit_progress(flash_control,file,progress);
+			last_progress = progress;
+		}
+	}
+	close(fd);
+
+	/* If this is a flash partition, adjust its size */
+	if(ffsh && ffs_index >= 0) {
+		printf("Updating actual size in partition header...\n");
+		ffs_update_act_size(ffsh, ffs_index, actual_size);
+	}
+	return(0);
+}
+
+static void
+flash_access_cleanup_bmc(void)
+{
+	if(ffsh)
+		ffs_close(ffsh);
+	flash_exit(fl_chip);
+	ast_sf_close(fl_ctrl);
+	close_devs();
+}
+
+static int
+flash_access_setup_bmc(bool use_lpc, bool need_write)
+{
+	int rc;
+	printf("Setting up BMC flash\n");
+	/* Open and map devices */
+	open_devs(use_lpc, true);
+
+	/* Create the AST flash controller */
+	rc = ast_sf_open(AST_SF_TYPE_BMC, &fl_ctrl);
+	if(rc) {
+		fprintf(stderr, "Failed to open controller\n");
+		return FLASH_SETUP_ERROR;
+	}
+
+	/* Open flash chip */
+	rc = flash_init(fl_ctrl, &fl_chip);
+	if(rc) {
+		fprintf(stderr, "Failed to open flash chip\n");
+		return FLASH_SETUP_ERROR;
+	}
+
+	/* Setup cleanup function */
+	atexit(flash_access_cleanup_bmc);
+	return FLASH_OK;
+}
+
+static void
+flash_access_cleanup_pnor(void)
+{
+	/* Re-lock flash */
+	if(need_relock)
+		set_wrprotect(true);
+
+	if(ffsh)
+		ffs_close(ffsh);
+	flash_exit(fl_chip);
+#ifdef __powerpc__
+	if(using_sfc)
+		sfc_close(fl_ctrl);
+	else
+		ast_sf_close(fl_ctrl);
+#else
+	ast_sf_close(fl_ctrl);
+#endif
+	close_devs();
+}
+
+static int
+flash_access_setup_pnor(bool use_lpc, bool use_sfc, bool need_write)
+{
+	int rc;
+	printf("Setting up BIOS flash\n");
+
+	/* Open and map devices */
+	open_devs(use_lpc, false);
+
+#ifdef __powerpc__
+	if(use_sfc) {
+		/* Create the SFC flash controller */
+		rc = sfc_open(&fl_ctrl);
+		if(rc) {
+			fprintf(stderr, "Failed to open controller\n");
+			return FLASH_SETUP_ERROR;
+		}
+		using_sfc = true;
+	} else {
+#endif
+		/* Create the AST flash controller */
+		rc = ast_sf_open(AST_SF_TYPE_PNOR, &fl_ctrl);
+		if(rc) {
+			fprintf(stderr, "Failed to open controller\n");
+			return FLASH_SETUP_ERROR;
+		}
+#ifdef __powerpc__
+	}
+#endif
+
+	/* Open flash chip */
+	rc = flash_init(fl_ctrl, &fl_chip);
+	if(rc) {
+		fprintf(stderr, "Failed to open flash chip\n");
+		return FLASH_SETUP_ERROR;
+	}
+
+	/* Unlock flash (PNOR only) */
+	if(need_write)
+		need_relock = set_wrprotect(false);
+
+	/* Setup cleanup function */
+	atexit(flash_access_cleanup_pnor);
+	return FLASH_OK;
+}
+
+uint8_t
+flash(FlashControl* flash_control,bool bmc_flash, uint32_t address, char* write_file, char* obj_path)
+{
+	bool has_sfc = false, has_ast = false, use_lpc = true;
+	bool erase = true, program = true;
+
+	int rc;
+	printf("flasher: %s, BMC = %d, address = 0x%x\n",write_file,bmc_flash,address);
+#ifdef __arm__
+	/* Check platform */
+	check_platform(&has_sfc, &has_ast);
+
+	/* Prepare for access */
+	if(bmc_flash) {
+		if(!has_ast) {
+			fprintf(stderr, "No BMC on this platform\n");
+			return FLASH_SETUP_ERROR;
+		}
+		rc = flash_access_setup_bmc(use_lpc, erase || program);
+		if(rc) {
+			return FLASH_SETUP_ERROR;
+		}
+	} else {
+		if(!has_ast && !has_sfc) {
+			fprintf(stderr, "No BMC nor SFC on this platform\n");
+			return FLASH_SETUP_ERROR;
+		}
+		rc = flash_access_setup_pnor(use_lpc, has_sfc, erase || program);
+		if(rc) {
+			return FLASH_SETUP_ERROR;
+		}
+	}
+
+	rc = flash_get_info(fl_chip, &fl_name,
+			&fl_total_size, &fl_erase_granule);
+	if(rc) {
+		fprintf(stderr, "Error %d getting flash info\n", rc);
+		return FLASH_SETUP_ERROR;
+	}
+#endif
+	if(strcmp(write_file,"")!=0)
+	{
+		// If file specified but not size, get size from file
+		struct stat stbuf;
+		if(stat(write_file, &stbuf)) {
+			perror("Failed to get file size");
+			return FLASH_ERROR;
+		}
+		uint32_t write_size = stbuf.st_size;
+#ifdef __arm__
+		rc = erase_chip();
+		if(rc) {
+			return FLASH_ERROR;
+		}
+		rc = program_file(flash_control, write_file, address, write_size);
+		if(rc) {
+			return FLASH_ERROR;
+		}
+#endif
+
+		printf("Flash done\n");
+	}
+	else
+	{
+		printf("Flash tuned\n");
+	}
+	return FLASH_OK;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	cmdline *cmd = user_data;
+	if(cmd->argc < 4)
+	{
+		g_print("flasher [flash name] [filename] [source object]\n");
+		g_main_loop_quit(cmd->loop);
+		return;
+	}
+	printf("Starting flasher: %s,%s,%s,\n",cmd->argv[1],cmd->argv[2],cmd->argv[3]);
+	ObjectSkeleton *object;
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	gchar *s;
+	s = g_strdup_printf("%s/%s",dbus_object_path,cmd->argv[1]);
+
+	object = object_skeleton_new(s);
+	g_free(s);
+
+	FlashControl* flash_control = flash_control_skeleton_new();
+	object_skeleton_set_flash_control(object, flash_control);
+	g_object_unref(flash_control);
+
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
+
+	/* Export all objects */
+	g_dbus_object_manager_server_set_connection(manager, connection);
+	bool bmc_flash = false;
+	uint32_t address = 0;
+	if(strcmp(cmd->argv[1],"bmc")==0) {
+		bmc_flash = true;
+	}
+	if(strcmp(cmd->argv[1],"bmc_ramdisk")==0) {
+		bmc_flash = true;
+		address = 0x20300000;
+	}
+	if(strcmp(cmd->argv[1],"bmc_kernel")==0) {
+		bmc_flash = true;
+		address = 0x20080000;
+	}
+
+	int rc = flash(flash_control,bmc_flash,address,cmd->argv[2],cmd->argv[3]);
+	if(rc) {
+		flash_message(connection,cmd->argv[3],"error","Flash Error");
+	} else {
+		flash_message(connection,cmd->argv[3],"done","");
+	}
+
+	//Object exits when done flashing
+	g_main_loop_quit(cmd->loop);
+}
+
+int
+main(int argc, char *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+	cmd.loop = loop;
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			NULL,
+			NULL,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+
+	return 0;
+}
diff --git a/objects/host_watchdog_obj.c b/objects/host_watchdog_obj.c
index dbc4119..e922dc3 100644
--- a/objects/host_watchdog_obj.c
+++ b/objects/host_watchdog_obj.c
@@ -1,186 +1,179 @@
-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-

-static const gchar* dbus_object_path = "/org/openbmc/watchdog";

-static const gchar* instance_name = "host0";

-static const gchar* dbus_name        = "org.openbmc.watchdog.Host";

-

-static GDBusObjectManagerServer *manager = NULL;

-static guint watchdogid = 0;

-

-static gboolean

-poll_watchdog(gpointer user_data)

-{

-	Watchdog *watchdog = object_get_watchdog((Object*)user_data);

-

- 	guint count = watchdog_get_watchdog(watchdog);

-	g_print("Polling watchdog: %d\n",count);

-	

-	if (count == 0)

-	{

-		//watchdog error, emit error and stop watchdog

-		watchdogid = 0;

-		watchdog_emit_watchdog_error(watchdog);

-		return FALSE;

-	}

-

-	//reset watchdog

-	watchdog_set_watchdog(watchdog,0);	

-	return TRUE;

-}

-

-static gboolean

-remove_watchdog(void)

-{

-    if (watchdogid)

-    {

-        g_source_remove(watchdogid);

-        watchdogid = 0;

-    }

-}

-

-static gboolean

-set_poll_interval (Watchdog  *wd,

-                GDBusMethodInvocation  *invocation,

-                guint                   interval,

-                gpointer                user_data)

-{

-    g_print("Setting watchdog poll interval to: %d\n", interval);

-    watchdog_set_poll_interval(wd, interval);

-    watchdog_complete_set(wd,invocation);

-}

-

-static gboolean

-on_start        (Watchdog  *wd,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-  	remove_watchdog();

-  	watchdog_set_watchdog(wd,0);

-	guint poll_interval = watchdog_get_poll_interval(wd);

-    g_print("Starting watchdog with poll interval: %d\n", poll_interval);

-  	watchdogid = g_timeout_add(poll_interval, poll_watchdog, user_data);

-	watchdog_complete_start(wd,invocation);

-	return TRUE;

-}

-

-static gboolean

-on_poke         (Watchdog  *wd,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	watchdog_set_watchdog(wd,1);

-	watchdog_complete_poke(wd,invocation);

-	return TRUE;

-}

-

-static gboolean

-on_stop         (Watchdog  *wd,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-    g_print("Stopping watchdog\n");

-    remove_watchdog();

-    watchdog_complete_stop(wd,invocation);

-    return TRUE;

-}

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-  	cmdline *cmd = user_data;

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-		gchar *s;

- 		s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);

-		ObjectSkeleton *object = object_skeleton_new (s);

-		g_free (s);

-

-		Watchdog *wd = watchdog_skeleton_new ();

-  		object_skeleton_set_watchdog (object, wd);

-  		g_object_unref (wd);

-

-		ObjectMapper* mapper = object_mapper_skeleton_new ();

-		object_skeleton_set_object_mapper (object, mapper);

-		g_object_unref (mapper);

-		

-  		// set properties

-  		watchdog_set_watchdog(wd,1);

-		

-		//define method callbacks here

- 		g_signal_connect (wd,

-                    "handle-start",

-                    G_CALLBACK (on_start),

-                    object); /* user_data */

- 

- 		g_signal_connect (wd,

-                    "handle-poke",

-                    G_CALLBACK (on_poke),

-                    object); /* user_data */

-

-        g_signal_connect (wd,

-                    "handle-stop",

-                    G_CALLBACK (on_stop),

-                    object); /* user_data */

-

-        g_signal_connect (wd,

-                    "handle-set",

-                    G_CALLBACK (set_poll_interval),

-                    object); /* user_data */

-

-  		/* Export the object (@manager takes its own reference to @object) */

-  		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-  		g_object_unref (object);

-

-  /* Export all objects */

-  g_dbus_object_manager_server_set_connection (manager, connection);

-  emit_object_added((GDBusObjectManager*)manager); 

-}

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-  //g_print ("Acquired the name %s\n", name);

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-  //g_print ("Lost the name %s\n", name);

-}

-

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+
+/* ------------------------------------------------------------------------- */
+
+static const gchar* dbus_object_path = "/org/openbmc/watchdog";
+static const gchar* instance_name = "host0";
+static const gchar* dbus_name = "org.openbmc.watchdog.Host";
+
+static GDBusObjectManagerServer *manager = NULL;
+static guint watchdogid = 0;
+
+static gboolean
+poll_watchdog(gpointer user_data)
+{
+	Watchdog *watchdog = object_get_watchdog((Object*)user_data);
+
+	guint count = watchdog_get_watchdog(watchdog);
+	g_print("Polling watchdog: %d\n",count);
+
+	if(count == 0)
+	{
+		//watchdog error, emit error and stop watchdog
+		watchdogid = 0;
+		watchdog_emit_watchdog_error(watchdog);
+		return FALSE;
+	}
+
+	//reset watchdog
+	watchdog_set_watchdog(watchdog,0);
+	return TRUE;
+}
+
+static gboolean
+remove_watchdog(void)
+{
+	if(watchdogid)
+	{
+		g_source_remove(watchdogid);
+		watchdogid = 0;
+	}
+	return TRUE;
+}
+
+static gboolean
+set_poll_interval(Watchdog *wd,
+		GDBusMethodInvocation *invocation,
+		guint interval,
+		gpointer user_data)
+{
+	g_print("Setting watchdog poll interval to: %d\n", interval);
+	watchdog_set_poll_interval(wd, interval);
+	watchdog_complete_set(wd,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_start(Watchdog *wd,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	remove_watchdog();
+	watchdog_set_watchdog(wd,0);
+	guint poll_interval = watchdog_get_poll_interval(wd);
+	g_print("Starting watchdog with poll interval: %d\n", poll_interval);
+	watchdogid = g_timeout_add(poll_interval, poll_watchdog, user_data);
+	watchdog_complete_start(wd,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_poke(Watchdog *wd,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	watchdog_set_watchdog(wd,1);
+	watchdog_complete_poke(wd,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_stop(Watchdog *wd,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	g_print("Stopping watchdog\n");
+	remove_watchdog();
+	watchdog_complete_stop(wd,invocation);
+	return TRUE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	gchar *s;
+	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
+	ObjectSkeleton *object = object_skeleton_new(s);
+	g_free(s);
+
+	Watchdog *wd = watchdog_skeleton_new();
+	object_skeleton_set_watchdog(object, wd);
+	g_object_unref(wd);
+
+	// set properties
+	watchdog_set_watchdog(wd,1);
+
+	//define method callbacks here
+	g_signal_connect(wd,
+			"handle-start",
+			G_CALLBACK(on_start),
+			object); /* user_data */
+
+	g_signal_connect(wd,
+			"handle-poke",
+			G_CALLBACK(on_poke),
+			object); /* user_data */
+
+	g_signal_connect(wd,
+			"handle-stop",
+			G_CALLBACK(on_stop),
+			object); /* user_data */
+
+	g_signal_connect(wd,
+			"handle-set",
+			G_CALLBACK(set_poll_interval),
+			object); /* user_data */
+
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_set_connection(manager, connection);
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//g_print ("Acquired the name %s\n", name);
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	//g_print ("Lost the name %s\n", name);
+}
+
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/hwmons_barreleye.c b/objects/hwmons_barreleye.c
index 5acde7c..07717cf 100644
--- a/objects/hwmons_barreleye.c
+++ b/objects/hwmons_barreleye.c
@@ -1,221 +1,212 @@
-#include "interfaces/openbmc_intf.h"

-#include <stdio.h>

-#include <fcntl.h>

-#include "openbmc.h"

-#include "gpio.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/sensors";

-static const gchar* dbus_name        = "org.openbmc.sensors.hwmon";

-

-static GDBusObjectManagerServer *manager = NULL;

-

-typedef struct {

-  const gchar* filename;

-  const gchar* name;

-  int poll_interval;

-  const gchar* units;

-  int scale;

-  int fd;

-} HWMON;

-

-#define  NUM_HWMONS 7

-

-// TODO: Don't hardcode

-//Hardcoded for barreleye

-HWMON hwmons[NUM_HWMONS] = { 

-	(HWMON){"/sys/class/hwmon/hwmon0/temp1_input","temperature/ambient",3000,"C",1000},

-	(HWMON){"/sys/class/hwmon/hwmon1/pwm1","speed/fan0",30000,"",1},

-	(HWMON){"/sys/class/hwmon/hwmon1/pwm2","speed/fan1",30000,"",1},

-	(HWMON){"/sys/class/hwmon/hwmon1/pwm3","speed/fan2",30000,"",1},

-	(HWMON){"/sys/class/hwmon/hwmon2/pwm1","speed/fan3",30000,"",1},

-	(HWMON){"/sys/class/hwmon/hwmon2/pwm2","speed/fan4",30000,"",1},

-	(HWMON){"/sys/class/hwmon/hwmon2/pwm3","speed/fan5",30000,"",1},

-};

-bool is_hwmon_valid(HWMON* hwmon)

-{

-	int fd = open(hwmon->filename, O_RDONLY);

-	if (fd == -1)

-	{

-		g_print("ERROR hwmon is not valid: %s\n",hwmon->filename);

-		return false;

-	}

-	close(fd);

-	return true;

-}

-

-static gboolean poll_hwmon(gpointer user_data)

-{

-	Hwmon *hwmon = object_get_hwmon((Object*)user_data);

-	SensorValue *sensor = object_get_sensor_value((Object*)user_data);

-	const gchar* filename = hwmon_get_sysfs_path(hwmon);

-

-	int fd = open(filename, O_RDONLY);

-	if (fd != -1)

-	{

-		char buf[255];

-		if (read(fd,&buf,255) == -1)

-		{

-			g_print("ERROR: Unable to read value: %s\n",filename);

-		} else {

-			guint32 scale = hwmon_get_scale(hwmon);

-			if (scale == 0)

-			{

-				g_print("ERROR: Invalid scale value of 0\n");

-				scale = 1;

-				

-			}

-			guint32 value = atoi(buf)/scale;

-			GVariant* v = NEW_VARIANT_U(value);

-			GVariant* old_value = sensor_value_get_value(sensor);

-			bool do_set = false;

-			if (old_value == NULL)

-			{

-				do_set = true;

-			}

-			else

-			{

-				if (GET_VARIANT_U(old_value) != value) { do_set = true; }

-			}

-			if (do_set)

-			{

-				g_print("Sensor changed: %s,%d\n",filename,value);

-				GVariant* v = NEW_VARIANT_U(value);

-				const gchar* units = sensor_value_get_units(sensor);

-				sensor_value_set_value(sensor,v);

-				sensor_value_emit_changed(sensor,v,units);

-			}

-		}

-		close(fd);

-	} else {

-		g_print("ERROR - hwmons: File %s doesn't exist\n",filename);

-	}

-

-	return TRUE;

-}

-static gboolean

-on_set_value   (SensorValue            *sensor,

-                GDBusMethodInvocation  *invocation,

-		GVariant*                v_value,	

-                gpointer                user_data)

-{

-	Hwmon *hwmon = object_get_hwmon((Object*)user_data);

-	const gchar* filename = hwmon_get_sysfs_path(hwmon);

-

-	int fd = open(filename, O_WRONLY);

-	if (fd != -1)

-	{

-		char buf[255];

-		guint32 value = GET_VARIANT_U(v_value);

-		sprintf(buf,"%d",value);

-		if (write(fd, buf, 255) == -1)

-		{

-			g_print("ERROR: Unable to read value: %s\n",filename);

-		}

-		close(fd);

-	}

-	sensor_value_complete_set_value(sensor,invocation);

-	return TRUE;

-}

-

-

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

-

-	cmdline *cmd = user_data;

-

-

-	manager = g_dbus_object_manager_server_new (dbus_object_path);

-	int i = 0;

-	for (i=0;i<NUM_HWMONS;i++)

-  	{

-		if (!is_hwmon_valid(&hwmons[i])) { continue; }

-		gchar *s;

-		s = g_strdup_printf ("%s/%s",dbus_object_path,hwmons[i].name);

-		object = object_skeleton_new (s);

-		g_free (s);

-

-		Hwmon *hwmon = hwmon_skeleton_new ();

-		object_skeleton_set_hwmon (object, hwmon);

-		g_object_unref (hwmon);

-

-		SensorValue *sensor = sensor_value_skeleton_new ();

-		object_skeleton_set_sensor_value (object, sensor);

-		g_object_unref (sensor);

-

-		ObjectMapper* mapper = object_mapper_skeleton_new ();

-		object_skeleton_set_object_mapper (object, mapper);

-		g_object_unref (mapper);

-

-		hwmon_set_sysfs_path(hwmon,hwmons[i].filename);

-		hwmon_set_scale(hwmon,hwmons[i].scale);

-		sensor_value_set_units(sensor,hwmons[i].units);

-

-		//define method callbacks here

-		g_signal_connect (sensor,

-       	            "handle-set-value",

-               	    G_CALLBACK (on_set_value),

-               	    object); /* user_data */

-		

-

-		if (hwmons[i].poll_interval > 0) {

-			g_timeout_add(hwmons[i].poll_interval, poll_hwmon, object);

-		}

-		/* Export the object (@manager takes its own reference to @object) */

-		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-		g_object_unref (object);

-	}

-	/* Export all objects */

- 	g_dbus_object_manager_server_set_connection (manager, connection);

-	emit_object_added((GDBusObjectManager*)manager); 

-}

-

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-}

-

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include "interfaces/openbmc_intf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include "openbmc.h"
+#include "gpio.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/sensors";
+static const gchar* dbus_name = "org.openbmc.sensors.hwmon";
+
+static GDBusObjectManagerServer *manager = NULL;
+
+typedef struct {
+	const gchar* filename;
+	const gchar* name;
+	int poll_interval;
+	const gchar* units;
+	int scale;
+	int fd;
+} HWMON;
+
+#define NUM_HWMONS 7
+
+// TODO: Don't hardcode
+//Hardcoded for barreleye
+HWMON hwmons[NUM_HWMONS] = {
+	(HWMON){"/sys/class/hwmon/hwmon0/temp1_input","temperature/ambient",3000,"C",1000},
+	(HWMON){"/sys/class/hwmon/hwmon1/pwm1","speed/fan0",30000,"",1},
+	(HWMON){"/sys/class/hwmon/hwmon1/pwm2","speed/fan1",30000,"",1},
+	(HWMON){"/sys/class/hwmon/hwmon1/pwm3","speed/fan2",30000,"",1},
+	(HWMON){"/sys/class/hwmon/hwmon2/pwm1","speed/fan3",30000,"",1},
+	(HWMON){"/sys/class/hwmon/hwmon2/pwm2","speed/fan4",30000,"",1},
+	(HWMON){"/sys/class/hwmon/hwmon2/pwm3","speed/fan5",30000,"",1},
+};
+
+bool
+is_hwmon_valid(HWMON* hwmon)
+{
+	int fd = open(hwmon->filename, O_RDONLY);
+	if(fd == -1)
+	{
+		g_print("ERROR hwmon is not valid: %s\n",hwmon->filename);
+		return false;
+	}
+	close(fd);
+	return true;
+}
+
+static gboolean
+poll_hwmon(gpointer user_data)
+{
+	Hwmon *hwmon = object_get_hwmon((Object*)user_data);
+	SensorValue *sensor = object_get_sensor_value((Object*)user_data);
+	const gchar* filename = hwmon_get_sysfs_path(hwmon);
+
+	int fd = open(filename, O_RDONLY);
+	if(fd != -1)
+	{
+		char buf[255];
+		if(read(fd,&buf,255) == -1)
+		{
+			g_print("ERROR: Unable to read value: %s\n",filename);
+		} else {
+			guint32 scale = hwmon_get_scale(hwmon);
+			if(scale == 0)
+			{
+				g_print("ERROR: Invalid scale value of 0\n");
+				scale = 1;
+
+			}
+			guint32 value = atoi(buf)/scale;
+			NEW_VARIANT_U(value);
+			GVariant* old_value = sensor_value_get_value(sensor);
+			bool do_set = false;
+			if(old_value == NULL)
+			{
+				do_set = true;
+			}
+			else
+			{
+				if(GET_VARIANT_U(old_value) != value) { do_set = true; }
+			}
+			if(do_set)
+			{
+				g_print("Sensor changed: %s,%d\n",filename,value);
+				GVariant* v = NEW_VARIANT_U(value);
+				const gchar* units = sensor_value_get_units(sensor);
+				sensor_value_set_value(sensor,v);
+				sensor_value_emit_changed(sensor,v,units);
+			}
+		}
+		close(fd);
+	} else {
+		g_print("ERROR - hwmons: File %s doesn't exist\n",filename);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+on_set_value(SensorValue *sensor,
+		GDBusMethodInvocation *invocation,
+		GVariant* v_value,
+		gpointer user_data)
+{
+	Hwmon *hwmon = object_get_hwmon((Object*)user_data);
+	const gchar* filename = hwmon_get_sysfs_path(hwmon);
+
+	int fd = open(filename, O_WRONLY);
+	if(fd != -1)
+	{
+		char buf[255];
+		guint32 value = GET_VARIANT_U(v_value);
+		sprintf(buf,"%d",value);
+		if(write(fd, buf, 255) == -1)
+		{
+			g_print("ERROR: Unable to read value: %s\n",filename);
+		}
+		close(fd);
+	}
+	sensor_value_complete_set_value(sensor,invocation);
+	return TRUE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	int i = 0;
+	for(i=0;i<NUM_HWMONS;i++)
+	{
+		if(!is_hwmon_valid(&hwmons[i])) { continue; }
+		gchar *s;
+		s = g_strdup_printf("%s/%s",dbus_object_path,hwmons[i].name);
+		object = object_skeleton_new(s);
+		g_free(s);
+
+		Hwmon *hwmon = hwmon_skeleton_new();
+		object_skeleton_set_hwmon(object, hwmon);
+		g_object_unref(hwmon);
+
+		SensorValue *sensor = sensor_value_skeleton_new();
+		object_skeleton_set_sensor_value(object, sensor);
+		g_object_unref(sensor);
+
+		hwmon_set_sysfs_path(hwmon,hwmons[i].filename);
+		hwmon_set_scale(hwmon,hwmons[i].scale);
+		sensor_value_set_units(sensor,hwmons[i].units);
+
+		//define method callbacks here
+		g_signal_connect(sensor,
+				"handle-set-value",
+				G_CALLBACK(on_set_value),
+				object); /* user_data */
+
+
+		if(hwmons[i].poll_interval > 0) {
+			g_timeout_add(hwmons[i].poll_interval, poll_hwmon, object);
+		}
+		/* Export the object (@manager takes its own reference to @object) */
+		g_dbus_object_manager_server_set_connection(manager, connection);
+		g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+		g_object_unref(object);
+	}
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/hwmons_palmetto.c b/objects/hwmons_palmetto.c
index c38a3c9..7d76c91 100644
--- a/objects/hwmons_palmetto.c
+++ b/objects/hwmons_palmetto.c
@@ -1,215 +1,207 @@
-#include "interfaces/openbmc_intf.h"

-#include <stdio.h>

-#include <fcntl.h>

-#include "openbmc.h"

-#include "gpio.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/sensors";

-static const gchar* dbus_name        = "org.openbmc.sensors.hwmon";

-

-static GDBusObjectManagerServer *manager = NULL;

-

-typedef struct {

-  const gchar* filename;

-  const gchar* name;

-  int poll_interval;

-  const gchar* units;

-  int scale;

-  int fd;

-} HWMON;

-

-#define  NUM_HWMONS 1

-

-// TODO: Don't hardcode

-//Hardcoded for palmetto

-HWMON hwmons[NUM_HWMONS] = { 

-	(HWMON){"/sys/class/hwmon/hwmon0/temp1_input","temperature/ambient",3000,"C",1000},

-};

-bool is_hwmon_valid(HWMON* hwmon)

-{

-	int fd = open(hwmon->filename, O_RDONLY);

-	if (fd == -1)

-	{

-		g_print("ERROR hwmon is not valid: %s\n",hwmon->filename);

-		return false;

-	}

-	close(fd);

-	return true;

-}

-

-static gboolean poll_hwmon(gpointer user_data)

-{

-	Hwmon *hwmon = object_get_hwmon((Object*)user_data);

-	SensorValue *sensor = object_get_sensor_value((Object*)user_data);

-	const gchar* filename = hwmon_get_sysfs_path(hwmon);

-

-	int fd = open(filename, O_RDONLY);

-	if (fd != -1)

-	{

-		char buf[255];

-		if (read(fd,&buf,255) == -1)

-		{

-			g_print("ERROR: Unable to read value: %s\n",filename);

-		} else {

-			guint32 scale = hwmon_get_scale(hwmon);

-			if (scale == 0)

-			{

-				g_print("ERROR: Invalid scale value of 0\n");

-				scale = 1;

-				

-			}

-			guint32 value = atoi(buf)/scale;

-			GVariant* v = NEW_VARIANT_U(value);

-			GVariant* old_value = sensor_value_get_value(sensor);

-			bool do_set = false;

-			if (old_value == NULL)

-			{

-				do_set = true;

-			}

-			else

-			{

-				if (GET_VARIANT_U(old_value) != value) { do_set = true; }

-			}

-			if (do_set)

-			{

-				g_print("Sensor changed: %s,%d\n",filename,value);

-				GVariant* v = NEW_VARIANT_U(value);

-				const gchar* units = sensor_value_get_units(sensor);

-				sensor_value_set_value(sensor,v);

-				sensor_value_emit_changed(sensor,v,units);

-			}

-		}

-		close(fd);

-	} else {

-		g_print("ERROR - hwmons: File %s doesn't exist\n",filename);

-	}

-

-	return TRUE;

-}

-static gboolean

-on_set_value   (SensorValue            *sensor,

-                GDBusMethodInvocation  *invocation,

-		GVariant*                v_value,	

-                gpointer                user_data)

-{

-	Hwmon *hwmon = object_get_hwmon((Object*)user_data);

-	const gchar* filename = hwmon_get_sysfs_path(hwmon);

-

-	int fd = open(filename, O_WRONLY);

-	if (fd != -1)

-	{

-		char buf[255];

-		guint32 value = GET_VARIANT_U(v_value);

-		sprintf(buf,"%d",value);

-		if (write(fd, buf, 255) == -1)

-		{

-			g_print("ERROR: Unable to read value: %s\n",filename);

-		}

-		close(fd);

-	}

-	sensor_value_complete_set_value(sensor,invocation);

-	return TRUE;

-}

-

-

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

-

-	cmdline *cmd = user_data;

-

-

-	manager = g_dbus_object_manager_server_new (dbus_object_path);

-	int i = 0;

-	for (i=0;i<NUM_HWMONS;i++)

-  	{

-		if (!is_hwmon_valid(&hwmons[i])) { continue; }

-		gchar *s;

-		s = g_strdup_printf ("%s/%s",dbus_object_path,hwmons[i].name);

-		object = object_skeleton_new (s);

-		g_free (s);

-

-		Hwmon *hwmon = hwmon_skeleton_new ();

-		object_skeleton_set_hwmon (object, hwmon);

-		g_object_unref (hwmon);

-

-		SensorValue *sensor = sensor_value_skeleton_new ();

-		object_skeleton_set_sensor_value (object, sensor);

-		g_object_unref (sensor);

-

-		ObjectMapper* mapper = object_mapper_skeleton_new ();

-		object_skeleton_set_object_mapper (object, mapper);

-		g_object_unref (mapper);

-

-		hwmon_set_sysfs_path(hwmon,hwmons[i].filename);

-		hwmon_set_scale(hwmon,hwmons[i].scale);

-		sensor_value_set_units(sensor,hwmons[i].units);

-

-		//define method callbacks here

-		g_signal_connect (sensor,

-       	            "handle-set-value",

-               	    G_CALLBACK (on_set_value),

-               	    object); /* user_data */

-		

-

-		if (hwmons[i].poll_interval > 0) {

-			g_timeout_add(hwmons[i].poll_interval, poll_hwmon, object);

-		}

-		/* Export the object (@manager takes its own reference to @object) */

-		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-		g_object_unref (object);

-	}

-	/* Export all objects */

- 	g_dbus_object_manager_server_set_connection (manager, connection);

-	emit_object_added((GDBusObjectManager*)manager); 

-}

-

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-}

-

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-  g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include "interfaces/openbmc_intf.h"
+#include <stdio.h>
+#include <fcntl.h>
+#include "openbmc.h"
+#include "gpio.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/sensors";
+static const gchar* dbus_name = "org.openbmc.sensors.hwmon";
+
+static GDBusObjectManagerServer *manager = NULL;
+
+typedef struct {
+	const gchar* filename;
+	const gchar* name;
+	int poll_interval;
+	const gchar* units;
+	int scale;
+	int fd;
+} HWMON;
+
+#define NUM_HWMONS 1
+
+// TODO: Don't hardcode
+//Hardcoded for palmetto
+HWMON hwmons[NUM_HWMONS] = {
+	(HWMON){"/sys/class/hwmon/hwmon0/temp1_input","temperature/ambient",3000,"C",1000},
+};
+
+bool
+is_hwmon_valid(HWMON* hwmon)
+{
+	int fd = open(hwmon->filename, O_RDONLY);
+	if(fd == -1)
+	{
+		g_print("ERROR hwmon is not valid: %s\n",hwmon->filename);
+		return false;
+	}
+	close(fd);
+	return true;
+}
+
+static gboolean
+poll_hwmon(gpointer user_data)
+{
+	Hwmon *hwmon = object_get_hwmon((Object*)user_data);
+	SensorValue *sensor = object_get_sensor_value((Object*)user_data);
+	const gchar* filename = hwmon_get_sysfs_path(hwmon);
+
+	int fd = open(filename, O_RDONLY);
+	if(fd != -1)
+	{
+		char buf[255];
+		if(read(fd,&buf,255) == -1)
+		{
+			g_print("ERROR: Unable to read value: %s\n",filename);
+		} else {
+			guint32 scale = hwmon_get_scale(hwmon);
+			if(scale == 0)
+			{
+				g_print("ERROR: Invalid scale value of 0\n");
+				scale = 1;
+
+			}
+			guint32 value = atoi(buf)/scale;
+			GVariant* v = NEW_VARIANT_U(value);
+			GVariant* old_value = sensor_value_get_value(sensor);
+			bool do_set = false;
+			if(old_value == NULL)
+			{
+				do_set = true;
+			}
+			else
+			{
+				if(GET_VARIANT_U(old_value) != value) { do_set = true; }
+			}
+			if(do_set)
+			{
+				g_print("Sensor changed: %s,%d\n",filename,value);
+				GVariant* v = NEW_VARIANT_U(value);
+				const gchar* units = sensor_value_get_units(sensor);
+				sensor_value_set_value(sensor,v);
+				sensor_value_emit_changed(sensor,v,units);
+			}
+		}
+		close(fd);
+	} else {
+		g_print("ERROR - hwmons: File %s doesn't exist\n",filename);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+on_set_value(SensorValue *sensor,
+		GDBusMethodInvocation *invocation,
+		GVariant* v_value,
+		gpointer user_data)
+{
+	Hwmon *hwmon = object_get_hwmon((Object*)user_data);
+	const gchar* filename = hwmon_get_sysfs_path(hwmon);
+
+	int fd = open(filename, O_WRONLY);
+	if(fd != -1)
+	{
+		char buf[255];
+		guint32 value = GET_VARIANT_U(v_value);
+		sprintf(buf,"%d",value);
+		if(write(fd, buf, 255) == -1)
+		{
+			g_print("ERROR: Unable to read value: %s\n",filename);
+		}
+		close(fd);
+	}
+	sensor_value_complete_set_value(sensor,invocation);
+	return TRUE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+
+	cmdline *cmd = user_data;
+
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	int i = 0;
+	for(i=0;i<NUM_HWMONS;i++)
+	{
+		if(!is_hwmon_valid(&hwmons[i])) { continue; }
+		gchar *s;
+		s = g_strdup_printf("%s/%s",dbus_object_path,hwmons[i].name);
+		object = object_skeleton_new(s);
+		g_free(s);
+
+		Hwmon *hwmon = hwmon_skeleton_new();
+		object_skeleton_set_hwmon(object, hwmon);
+		g_object_unref(hwmon);
+
+		SensorValue *sensor = sensor_value_skeleton_new();
+		object_skeleton_set_sensor_value(object, sensor);
+		g_object_unref(sensor);
+
+		hwmon_set_sysfs_path(hwmon,hwmons[i].filename);
+		hwmon_set_scale(hwmon,hwmons[i].scale);
+		sensor_value_set_units(sensor,hwmons[i].units);
+
+		//define method callbacks here
+		g_signal_connect(sensor,
+				"handle-set-value",
+				G_CALLBACK(on_set_value),
+				object); /* user_data */
+
+
+		if(hwmons[i].poll_interval > 0) {
+			g_timeout_add(hwmons[i].poll_interval, poll_hwmon, object);
+		}
+		/* Export the object (@manager takes its own reference to @object) */
+		g_dbus_object_manager_server_set_connection(manager, connection);
+		g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+		g_object_unref(object);
+	}
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/led_controller.c b/objects/led_controller.c
old mode 100755
new mode 100644
index 4fe0aa4..9eda9ee
--- a/objects/led_controller.c
+++ b/objects/led_controller.c
@@ -1,543 +1,581 @@
-#include <stdio.h>

-#include <stdlib.h>

-#include <errno.h>

-#include <string.h>

-#include <dirent.h>

-#include <systemd/sd-bus.h>

-

-/*

- * These are control files that are present for each led under

- *'/sys/class/leds/<led_name>/' which are used to trigger action

- * on the respective leds by writing predefined data.

- */

-const char *power_ctrl = "brightness";

-const char *blink_ctrl = "trigger";

-const char *duty_on    = "delay_on";

-const char *duty_off   = "delay_off";

-

-/*

- * --------------------------------------------------

- * Given the dbus path, returns the name of the LED

- * --------------------------------------------------

- */

-char *get_led_name(const char *dbus_path)

-{

-    char *led_name = NULL;

-

-    /* Get the led name from /org/openbmc/control/led/<name> */

-    led_name = strrchr(dbus_path, '/');

-    if(led_name)

-    {

-        led_name++;

-    }

-

-    return led_name;

-}

-

-/*

- * -------------------------------------------------------------------------

- * Writes the 'on / off / blink' trigger to leds.

- * -------------------------------------------------------------------------

- */

-int write_to_led(const char *name, const char *ctrl_file, const char *value)

-{

-    /* Generic error reporter. */

-    int rc = -1;

-

-    /* To get /sys/class/leds/<name>/<control file> */

-    char led_path[128] = {0};

-

-    int len = 0;

-    len = snprintf(led_path, sizeof(led_path),

-                   "/sys/class/leds/%s/%s",name, ctrl_file);

-    if(len >= sizeof(led_path))

-    {

-        fprintf(stderr, "Error. LED path is too long. :[%d]\n",len);

-        return rc;

-    }

-

-    FILE *fp = fopen(led_path,"w");

-    if(fp == NULL)

-    {

-        fprintf(stderr,"Error:[%s] opening:[%s]\n",strerror(errno),led_path);

-        return rc;

-    }

-

-    rc = fwrite(value, strlen(value), 1, fp);

-    if(rc != 1)

-    {

-        fprintf(stderr, "Error:[%s] writing to :[%s]\n",strerror(errno),led_path);

-    }

-

-    fclose(fp);

-

-    /* When we get here, rc would be what it was from writing to the file */

-    return (rc == 1) ? 0 : -1;

-}

-

-/*

- * ----------------------------------------------------------------

- * Router function for any LED operations that come via dbus

- *----------------------------------------------------------------

- */

-static int led_function_router(sd_bus_message *msg, void *user_data,

-                               sd_bus_error *ret_error)

-{

-    /* Generic error reporter. */

-    int rc = -1;

-

-    /* Extract the led name from the full dbus path */

-    const char *led_path = sd_bus_message_get_path(msg);

-    if(led_path == NULL)

-    {

-        fprintf(stderr, "Error. LED path is empty");

-        return sd_bus_reply_method_return(msg, "i", rc);

-    }

-

-    char *led_name = get_led_name(led_path);

-    if(led_name == NULL)

-    {

-        fprintf(stderr, "Invalid LED name for path :[%s]\n",led_path);

-        return sd_bus_reply_method_return(msg, "i", rc);

-    }

-

-    /* Now that we have the LED name, get the Operation. */

-    const char *led_function = sd_bus_message_get_member(msg);

-    if(led_function == NULL)

-    {

-        fprintf(stderr, "Null LED function specificed for : [%s]\n",led_name);

-        return sd_bus_reply_method_return(msg, "i", rc);

-    }

-

-    /* Route the user action to appropriate handlers. */

-    if( (strcmp(led_function, "setOn") == 0) ||

-        (strcmp(led_function, "setOff") == 0))

-    {

-        rc = led_stable_state_function(led_name, led_function);

-        return sd_bus_reply_method_return(msg, "i", rc);

-    }

-    else if( (strcmp(led_function, "setBlinkFast") == 0) ||

-             (strcmp(led_function, "setBlinkSlow") == 0))

-    {

-        rc = led_default_blink(led_name, led_function);

-        return sd_bus_reply_method_return(msg, "i", rc);

-    }

-    else if(strcmp(led_function, "BlinkCustom") == 0)

-    {

-        rc = led_custom_blink(led_name, msg);

-        return sd_bus_reply_method_return(msg, "i", rc);

-    }

-    else if(strcmp(led_function, "GetLedState") == 0)

-    {

-        char value_str[10] = {0};

-        const char *led_state = NULL;

-

-        rc = read_led(led_name, power_ctrl, value_str, sizeof(value_str)-1);

-        if(rc >= 0)

-        {

-            /* LED is active HI */

-            led_state = strtoul(value_str, NULL, 0) ? "On" : "Off";

-        }

-        return sd_bus_reply_method_return(msg, "is", rc, led_state);

-    }

-    else

-    {

-        fprintf(stderr,"Invalid LED function:[%s]\n",led_function);

-    }

-

-    return sd_bus_reply_method_return(msg, "i", rc);

-}

-

-/*

- * --------------------------------------------------------------

- * Turn On or Turn Off the LED

- * --------------------------------------------------------------

- */

-int led_stable_state_function(char *led_name, char *led_function)

-{

-    /* Generic error reporter. */

-    int rc = -1;

-

-    const char *value = NULL;

-    if(strcmp(led_function, "setOff") == 0)

-    {

-        /* LED active low */

-        value = "0";

-    }

-    else if(strcmp(led_function, "setOn") == 0)

-    {

-        value  = "255";

-    }

-    else

-    {

-        fprintf(stderr,"Invalid LED stable state operation:[%s] \n",led_function);

-        return rc;

-    }

-

-    /*

-     * Before doing anything, need to turn off the blinking

-     * if there is one in progress by writing 'none' to trigger

-     */

-    rc = write_to_led(led_name, blink_ctrl, "none");

-    if(rc < 0)

-    {

-        fprintf(stderr,"Error disabling blink. Function:[%s]\n", led_function);

-        return rc;

-    }

-

-    /*

-     * Open the brightness file and write corresponding values.

-     */

-    rc = write_to_led(led_name, power_ctrl, value);

-    if(rc < 0)

-    {

-        fprintf(stderr,"Error driving LED. Function:[%s]\n", led_function);

-    }

-

-    return rc;

-}

-

-//-----------------------------------------------------------------------------------

-// Given the on and off duration, applies the action on the specified LED.

-//-----------------------------------------------------------------------------------

-int blink_led(const char *led_name, const char *on_duration, const char *off_duration)

-{

-    /* Generic error reporter */

-    int rc = -1;

-

-    /* Protocol demands that 'timer' be echoed to 'trigger' */

-    rc = write_to_led(led_name, blink_ctrl, "timer");

-    if(rc < 0)

-    {

-        fprintf(stderr,"Error writing timer to Led:[%s]\n", led_name);

-        return rc;

-    }

-

-    /*

-     * After writing 'timer to 'trigger', 2 new files get generated namely

-     *'delay_on' and 'delay_off' which are telling the time duration for a

-     * particular LED on and off.

-     */

-    rc = write_to_led(led_name, duty_on, on_duration);

-    if(rc < 0)

-    {

-        fprintf(stderr,"Error writing [%s] to delay_on:[%s]\n",on_duration,led_name);

-        return rc;

-    }

-

-    rc = write_to_led(led_name, duty_off, off_duration);

-    if(rc < 0)

-    {

-        fprintf(stderr,"Error writing [%s] to delay_off:[%s]\n",off_duration,led_name);

-    }

-

-    return rc;

-}

-

-/*

- * ----------------------------------------------------

- * Default blink action on the LED.

- * ----------------------------------------------------

- */

-int led_default_blink(char *led_name, char *blink_type)

-{

-    /* Generic error reporter */

-    int rc = -1;

-

-    /* How long the LED needs to be in on and off state while blinking */

-    const char *on_duration = NULL;

-    const char *off_duration = NULL;

-    if(strcmp(blink_type, "setBlinkSlow") == 0)

-    {

-        //*Delay 900 millisec before 'on' and delay 900 millisec before off */

-        on_duration = "900";

-        off_duration = "900";

-    }

-    else if(strcmp(blink_type, "setBlinkFast") == 0)

-    {

-        /* Delay 200 millisec before 'on' and delay 200 millisec before off */

-        on_duration = "200";

-        off_duration = "200";

-    }

-    else

-    {

-        fprintf(stderr,"Invalid blink operation:[%s]\n",blink_type);

-        return rc;

-    }

-

-    rc = blink_led(led_name, on_duration, off_duration);

-

-    return rc;

-}

-

-/*

- * -------------------------------------------------

- * Blinks at user defined 'on' and 'off' intervals.

- * -------------------------------------------------

- */

-int led_custom_blink(const char *led_name, sd_bus_message *msg)

-{

-    /* Generic error reporter. */

-    int rc = -1;

-    int led_len = 0;

-

-    /* User supplied 'on' and 'off' duration converted into string */

-    char on_duration[32] = {0};

-    char off_duration[32] = {0};

-

-    /* User supplied 'on' and 'off' duration */

-    uint32_t user_input_on = 0;

-    uint32_t user_input_off = 0;

-

-    /* Extract values into 'ss' ( string, string) */

-    rc = sd_bus_message_read(msg, "uu", &user_input_on, &user_input_off);

-    if(rc < 0)

-    {

-        fprintf(stderr, "Failed to read 'on' and 'off' duration.[%s]\n", strerror(-rc));

-    }

-    else

-    {

-        /*

-         * Converting user supplied integer arguments into string as required by

-         * sys interface. The top level REST will make sure that an error is

-         * thrown right away on invalid inputs. However, REST is allowing the

-         * unsigned decimal and floating numbers but when its received here, its

-         * received as decimal so no input validation needed.

-         */

-        led_len = snprintf(on_duration, sizeof(on_duration),

-                           "%d",user_input_on);

-        if(led_len >= sizeof(on_duration))

-        {

-            fprintf(stderr, "Error. Blink ON duration is too long. :[%d]\n",led_len);

-            return rc;

-        }

-

-        led_len = snprintf(off_duration, sizeof(off_duration),

-                           "%d",user_input_off);

-        if(led_len >= sizeof(off_duration))

-        {

-            fprintf(stderr, "Error. Blink OFF duration is too long. :[%d]\n",led_len);

-            return rc;

-        }

-

-        /* We are good here.*/

-        rc = blink_led(led_name, on_duration, off_duration);

-    }

-    return rc;

-}

-

-/*

- * ---------------------------------------------------------------

- * Gets the current value of passed in LED file

- * Mainly used for reading 'brightness'

- * NOTE : It is the responsibility of the caller to allocate

- * sufficient space for buffer. This will read upto user supplied

- * size -or- entire contents of file whichever is smaller

- * ----------------------------------------------------------------

- */

-int read_led(const char *name, const char *ctrl_file,

-             void *value, const size_t len)

-{

-    /* Generic error reporter. */

-    int rc = -1;

-    int count = 0;

-

-    if(value == NULL || len <= 0)

-    {

-        fprintf(stderr, "Invalid buffer passed to LED read\n");

-        return rc;

-    }

-

-    /* To get /sys/class/leds/<name>/<control file> */

-    char led_path[128] = {0};

-

-    int led_len = 0;

-    led_len = snprintf(led_path, sizeof(led_path),

-                   "/sys/class/leds/%s/%s",name, ctrl_file);

-    if(led_len >= sizeof(led_path))

-    {

-        fprintf(stderr, "Error. LED path is too long. :[%d]\n",led_len);

-        return rc;

-    }

-

-    FILE *fp = fopen(led_path,"rb");

-    if(fp == NULL)

-    {

-        fprintf(stderr,"Error:[%s] opening:[%s]\n",strerror(errno),led_path);

-        return rc;

-    }

-

-    char *sysfs_value = (char *)value;

-    while(!feof(fp) && (count < len))

-    {

-        sysfs_value[count++] = fgetc(fp);

-    }

-

-    fclose(fp);

-    return 0;

-}

-

-/*

- * -----------------------------------------------

- * Dbus Services offered by this LED controller

- * -----------------------------------------------

- */

-static const sd_bus_vtable led_control_vtable[] =

-{

-    SD_BUS_VTABLE_START(0),

-    SD_BUS_METHOD("setOn", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),

-    SD_BUS_METHOD("setOff", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),

-    SD_BUS_METHOD("setBlinkFast", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),

-    SD_BUS_METHOD("setBlinkSlow", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),

-    SD_BUS_METHOD("GetLedState", "", "is", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),

-    SD_BUS_METHOD("BlinkCustom", "uu", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),

-    SD_BUS_VTABLE_END,

-};

-

-/*

- * ---------------------------------------------

- * Interested in all files except standard ones

- * ---------------------------------------------

- */

-int led_select(const struct dirent *entry)

-{

-    if( (strcmp(entry->d_name, ".") == 0) ||

-        (strcmp(entry->d_name, "..") == 0))

-    {

-        return 0;

-    }

-    return 1;

-}

-

-/*

- * ------------------------------------------------

- * Called as part of setting up skeleton services.

- * -----------------------------------------------

- */

-int start_led_services()

-{

-    /* Generic error reporter. */

-    int rc = -1;

-    int num_leds = 0;

-    int count_leds = 0;

-

-    /* Bus and slot where we are offering the LED dbus service. */

-    sd_bus *bus_type = NULL;

-    sd_bus_slot *led_slot = NULL;

-

-    /* For walking '/sys/class/leds/' looking for names of LED.*/

-    struct dirent **led_list;

-

-    /* Get a hook onto system bus. */

-    rc = sd_bus_open_system(&bus_type);

-    if(rc < 0)

-    {

-        fprintf(stderr,"Error opening system bus.\n");

-        return rc;

-    }

-

-    count_leds = num_leds = scandir("/sys/class/leds/",

-                                    &led_list, led_select, alphasort);

-    if(num_leds <= 0)

-    {

-        fprintf(stderr,"No LEDs present in the system\n");

-

-        sd_bus_slot_unref(led_slot);

-        sd_bus_unref(bus_type);

-        return rc;

-    }

-

-    /* Fully qualified Dbus object for a particular LED */

-    char led_object[128] = {0};

-    int len = 0;

-

-    /* For each led present, announce the service on dbus. */

-    while(num_leds--)

-    {

-        memset(led_object, 0x0, sizeof(led_object));

-

-        len = snprintf(led_object, sizeof(led_object), "%s%s",

-                "/org/openbmc/control/led/", led_list[num_leds]->d_name);

-

-        if(len >= sizeof(led_object))

-        {

-            fprintf(stderr, "Error. LED object is too long:[%d]\n",len);

-            rc = -1;

-            break;

-        }

-

-        /* Install the object */

-        rc = sd_bus_add_object_vtable(bus_type,

-                                      &led_slot,

-                                      led_object,          /* object path */

-                                      "org.openbmc.Led",   /* interface name */

-                                      led_control_vtable,

-                                      NULL);

-

-        if (rc < 0)

-        {

-            fprintf(stderr, "Failed to add object to dbus: %s\n", strerror(-rc));

-            break;

-        }

-    }

-

-    /* Done with all registration. */

-    while (count_leds > 0)

-    {

-        free(led_list[--count_leds]);

-    }

-    free(led_list);

-

-    /* If we had success in adding the providers, request for a bus name. */

-    if(rc == 0)

-    {

-        /* Take one in OpenBmc */

-        rc = sd_bus_request_name(bus_type, "org.openbmc.control.led", 0);

-        if (rc < 0)

-        {

-            fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-rc));

-        }

-        else

-        {

-            for (;;)

-            {

-                /* Process requests */

-                rc = sd_bus_process(bus_type, NULL);

-                if (rc < 0)

-                {

-                    fprintf(stderr, "Failed to process bus: %s\n", strerror(-rc));

-                    break;

-                }

-                if (rc > 0)

-                {

-                    continue;

-                }

-

-                rc = sd_bus_wait(bus_type, (uint64_t) - 1);

-                if (rc < 0)

-                {

-                    fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-rc));

-                    break;

-                }

-            }

-        }

-    }

-    sd_bus_slot_unref(led_slot);

-    sd_bus_unref(bus_type);

-

-    return rc;

-}

-

-int main(void)

-{

-    int rc = 0;

-

-    /* This call is not supposed to return. If it does, then an error */

-    rc = start_led_services();

-    if(rc < 0)

-    {

-        fprintf(stderr, "Error starting LED Services. Exiting");

-    }

-

-    return rc;

-}

+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <systemd/sd-bus.h>
+
+static int led_stable_state_function(const char *, const char *);
+static int led_default_blink(const char *, const char *);
+static int read_led(const char *, const char *, void *, const size_t);
+static int led_custom_blink(const char *, sd_bus_message *);
+
+/*
+ * These are control files that are present for each led under
+ *'/sys/class/leds/<led_name>/' which are used to trigger action
+ * on the respective leds by writing predefined data.
+ */
+const char *power_ctrl = "brightness";
+const char *blink_ctrl = "trigger";
+const char *duty_on = "delay_on";
+const char *duty_off = "delay_off";
+
+/*
+ * --------------------------------------------------
+ * Given the dbus path, returns the name of the LED
+ * --------------------------------------------------
+ */
+char *
+get_led_name(const char *dbus_path)
+{
+	char *led_name = NULL;
+
+	/* Get the led name from /org/openbmc/control/led/<name> */
+	led_name = strrchr(dbus_path, '/');
+	if(led_name)
+	{
+		led_name++;
+	}
+
+	return led_name;
+}
+
+/*
+ * -------------------------------------------------------------------------
+ * Writes the 'on / off / blink' trigger to leds.
+ * -------------------------------------------------------------------------
+ */
+int
+write_to_led(const char *name, const char *ctrl_file, const char *value)
+{
+	/* Generic error reporter. */
+	int rc = -1;
+
+	/* To get /sys/class/leds/<name>/<control file> */
+	char led_path[128] = {0};
+
+	int len = 0;
+	len = snprintf(led_path, sizeof(led_path),
+			"/sys/class/leds/%s/%s",name, ctrl_file);
+	if(len >= sizeof(led_path))
+	{
+		fprintf(stderr, "Error. LED path is too long. :[%d]\n",len);
+		return rc;
+	}
+
+	FILE *fp = fopen(led_path,"w");
+	if(fp == NULL)
+	{
+		fprintf(stderr,"Error:[%s] opening:[%s]\n",strerror(errno),led_path);
+		return rc;
+	}
+
+	rc = fwrite(value, strlen(value), 1, fp);
+	if(rc != 1)
+	{
+		fprintf(stderr, "Error:[%s] writing to :[%s]\n",strerror(errno),led_path);
+	}
+
+	fclose(fp);
+
+	/* When we get here, rc would be what it was from writing to the file */
+	return (rc == 1) ? 0 : -1;
+}
+
+/*
+ * ----------------------------------------------------------------
+ * Router function for any LED operations that come via dbus
+ *----------------------------------------------------------------
+ */
+static int
+led_function_router(sd_bus_message *msg, void *user_data,
+		sd_bus_error *ret_error)
+{
+	/* Generic error reporter. */
+	int rc = -1;
+
+	/* Extract the led name from the full dbus path */
+	const char *led_path = sd_bus_message_get_path(msg);
+	if(led_path == NULL)
+	{
+		fprintf(stderr, "Error. LED path is empty");
+		return sd_bus_reply_method_return(msg, "i", rc);
+	}
+
+	char *led_name = get_led_name(led_path);
+	if(led_name == NULL)
+	{
+		fprintf(stderr, "Invalid LED name for path :[%s]\n",led_path);
+		return sd_bus_reply_method_return(msg, "i", rc);
+	}
+
+	/* Now that we have the LED name, get the Operation. */
+	const char *led_function = sd_bus_message_get_member(msg);
+	if(led_function == NULL)
+	{
+		fprintf(stderr, "Null LED function specificed for : [%s]\n",led_name);
+		return sd_bus_reply_method_return(msg, "i", rc);
+	}
+
+	/* Route the user action to appropriate handlers. */
+	if( (strcmp(led_function, "setOn") == 0) ||
+			(strcmp(led_function, "setOff") == 0))
+	{
+		rc = led_stable_state_function(led_name, led_function);
+		return sd_bus_reply_method_return(msg, "i", rc);
+	}
+	else if( (strcmp(led_function, "setBlinkFast") == 0) ||
+			(strcmp(led_function, "setBlinkSlow") == 0))
+	{
+		rc = led_default_blink(led_name, led_function);
+		return sd_bus_reply_method_return(msg, "i", rc);
+	}
+	else if(strcmp(led_function, "BlinkCustom") == 0)
+	{
+		rc = led_custom_blink(led_name, msg);
+		return sd_bus_reply_method_return(msg, "i", rc);
+	}
+	else if(strcmp(led_function, "GetLedState") == 0)
+	{
+		char value_str[10] = {0};
+		const char *led_state = NULL;
+
+		rc = read_led(led_name, power_ctrl, value_str, sizeof(value_str)-1);
+		if(rc >= 0)
+		{
+			/* LED is active HI */
+			led_state = strtoul(value_str, NULL, 0) ? "On" : "Off";
+		}
+		return sd_bus_reply_method_return(msg, "is", rc, led_state);
+	}
+	else
+	{
+		fprintf(stderr,"Invalid LED function:[%s]\n",led_function);
+	}
+
+	return sd_bus_reply_method_return(msg, "i", rc);
+}
+
+/*
+ * --------------------------------------------------------------
+ * Turn On or Turn Off the LED
+ * --------------------------------------------------------------
+ */
+static int
+led_stable_state_function(const char *led_name, const char *led_function)
+{
+	/* Generic error reporter. */
+	int rc = -1;
+
+	const char *value = NULL;
+	if(strcmp(led_function, "setOff") == 0)
+	{
+		/* LED active low */
+		value = "0";
+	}
+	else if(strcmp(led_function, "setOn") == 0)
+	{
+		value = "255";
+	}
+	else
+	{
+		fprintf(stderr,"Invalid LED stable state operation:[%s] \n",led_function);
+		return rc;
+	}
+
+	/*
+	 * Before doing anything, need to turn off the blinking
+	 * if there is one in progress by writing 'none' to trigger
+	 */
+	rc = write_to_led(led_name, blink_ctrl, "none");
+	if(rc < 0)
+	{
+		fprintf(stderr,"Error disabling blink. Function:[%s]\n", led_function);
+		return rc;
+	}
+
+	/*
+	 * Open the brightness file and write corresponding values.
+	 */
+	rc = write_to_led(led_name, power_ctrl, value);
+	if(rc < 0)
+	{
+		fprintf(stderr,"Error driving LED. Function:[%s]\n", led_function);
+	}
+
+	return rc;
+}
+
+//-----------------------------------------------------------------------------------
+// Given the on and off duration, applies the action on the specified LED.
+//-----------------------------------------------------------------------------------
+int
+blink_led(const char *led_name, const char *on_duration, const char *off_duration)
+{
+	/* Generic error reporter */
+	int rc = -1;
+
+	/* Protocol demands that 'timer' be echoed to 'trigger' */
+	rc = write_to_led(led_name, blink_ctrl, "timer");
+	if(rc < 0)
+	{
+		fprintf(stderr,"Error writing timer to Led:[%s]\n", led_name);
+		return rc;
+	}
+
+	/*
+	 * After writing 'timer to 'trigger', 2 new files get generated namely
+	 *'delay_on' and 'delay_off' which are telling the time duration for a
+	 * particular LED on and off.
+	 */
+	rc = write_to_led(led_name, duty_on, on_duration);
+	if(rc < 0)
+	{
+		fprintf(stderr,"Error writing [%s] to delay_on:[%s]\n",on_duration,led_name);
+		return rc;
+	}
+
+	rc = write_to_led(led_name, duty_off, off_duration);
+	if(rc < 0)
+	{
+		fprintf(stderr,"Error writing [%s] to delay_off:[%s]\n",off_duration,led_name);
+	}
+
+	return rc;
+}
+
+/*
+ * ----------------------------------------------------
+ * Default blink action on the LED.
+ * ----------------------------------------------------
+ */
+static int
+led_default_blink(const char *led_name, const char *blink_type)
+{
+	/* Generic error reporter */
+	int rc = -1;
+
+	/* How long the LED needs to be in on and off state while blinking */
+	const char *on_duration = NULL;
+	const char *off_duration = NULL;
+	if(strcmp(blink_type, "setBlinkSlow") == 0)
+	{
+		//*Delay 900 millisec before 'on' and delay 900 millisec before off */
+		on_duration = "900";
+		off_duration = "900";
+	}
+	else if(strcmp(blink_type, "setBlinkFast") == 0)
+	{
+		/* Delay 200 millisec before 'on' and delay 200 millisec before off */
+		on_duration = "200";
+		off_duration = "200";
+	}
+	else
+	{
+		fprintf(stderr,"Invalid blink operation:[%s]\n",blink_type);
+		return rc;
+	}
+
+	rc = blink_led(led_name, on_duration, off_duration);
+
+	return rc;
+}
+
+/*
+ * -------------------------------------------------
+ * Blinks at user defined 'on' and 'off' intervals.
+ * -------------------------------------------------
+ */
+static int
+led_custom_blink(const char *led_name, sd_bus_message *msg)
+{
+	/* Generic error reporter. */
+	int rc = -1;
+	int led_len = 0;
+
+	/* User supplied 'on' and 'off' duration converted into string */
+	char on_duration[32] = {0};
+	char off_duration[32] = {0};
+
+	/* User supplied 'on' and 'off' duration */
+	uint32_t user_input_on = 0;
+	uint32_t user_input_off = 0;
+
+	/* Extract values into 'ss' ( string, string) */
+	rc = sd_bus_message_read(msg, "uu", &user_input_on, &user_input_off);
+	if(rc < 0)
+	{
+		fprintf(stderr, "Failed to read 'on' and 'off' duration.[%s]\n", strerror(-rc));
+	}
+	else
+	{
+		/*
+		 * Converting user supplied integer arguments into string as required by
+		 * sys interface. The top level REST will make sure that an error is
+		 * thrown right away on invalid inputs. However, REST is allowing the
+		 * unsigned decimal and floating numbers but when its received here, its
+		 * received as decimal so no input validation needed.
+		 */
+		led_len = snprintf(on_duration, sizeof(on_duration),
+				"%d",user_input_on);
+		if(led_len >= sizeof(on_duration))
+		{
+			fprintf(stderr, "Error. Blink ON duration is too long. :[%d]\n",led_len);
+			return rc;
+		}
+
+		led_len = snprintf(off_duration, sizeof(off_duration),
+				"%d",user_input_off);
+		if(led_len >= sizeof(off_duration))
+		{
+			fprintf(stderr, "Error. Blink OFF duration is too long. :[%d]\n",led_len);
+			return rc;
+		}
+
+		/* We are good here.*/
+		rc = blink_led(led_name, on_duration, off_duration);
+	}
+	return rc;
+}
+
+/*
+ * ---------------------------------------------------------------
+ * Gets the current value of passed in LED file
+ * Mainly used for reading 'brightness'
+ * NOTE : It is the responsibility of the caller to allocate
+ * sufficient space for buffer. This will read upto user supplied
+ * size -or- entire contents of file whichever is smaller
+ * ----------------------------------------------------------------
+ */
+static int
+read_led(const char *name, const char *ctrl_file,
+		void *value, const size_t len)
+{
+	/* Generic error reporter. */
+	int rc = -1;
+	int count = 0;
+
+	if(value == NULL || len <= 0)
+	{
+		fprintf(stderr, "Invalid buffer passed to LED read\n");
+		return rc;
+	}
+
+	/* To get /sys/class/leds/<name>/<control file> */
+	char led_path[128] = {0};
+
+	int led_len = 0;
+	led_len = snprintf(led_path, sizeof(led_path),
+			"/sys/class/leds/%s/%s",name, ctrl_file);
+	if(led_len >= sizeof(led_path))
+	{
+		fprintf(stderr, "Error. LED path is too long. :[%d]\n",led_len);
+		return rc;
+	}
+
+	FILE *fp = fopen(led_path,"rb");
+	if(fp == NULL)
+	{
+		fprintf(stderr,"Error:[%s] opening:[%s]\n",strerror(errno),led_path);
+		return rc;
+	}
+
+	char *sysfs_value = (char *)value;
+	while(!feof(fp) && (count < len))
+	{
+		sysfs_value[count++] = fgetc(fp);
+	}
+
+	fclose(fp);
+	return 0;
+}
+
+/*
+ * -----------------------------------------------
+ * Dbus Services offered by this LED controller
+ * -----------------------------------------------
+ */
+static const sd_bus_vtable led_control_vtable[] =
+{
+	SD_BUS_VTABLE_START(0),
+	SD_BUS_METHOD("setOn", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),
+	SD_BUS_METHOD("setOff", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),
+	SD_BUS_METHOD("setBlinkFast", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),
+	SD_BUS_METHOD("setBlinkSlow", "", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),
+	SD_BUS_METHOD("GetLedState", "", "is", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),
+	SD_BUS_METHOD("BlinkCustom", "uu", "i", &led_function_router, SD_BUS_VTABLE_UNPRIVILEGED),
+	SD_BUS_VTABLE_END,
+};
+
+/*
+ * ---------------------------------------------
+ * Interested in all files except standard ones
+ * ---------------------------------------------
+ */
+int
+led_select(const struct dirent *entry)
+{
+	if( (strcmp(entry->d_name, ".") == 0) ||
+			(strcmp(entry->d_name, "..") == 0))
+	{
+		return 0;
+	}
+	return 1;
+}
+
+/*
+ * ------------------------------------------------
+ * Called as part of setting up skeleton services.
+ * -----------------------------------------------
+ */
+int
+start_led_services()
+{
+	static const char *led_dbus_root = "/org/openbmc/control/led";
+
+	/* Generic error reporter. */
+	int rc = -1;
+	int num_leds = 0;
+	int count_leds = 0;
+
+	/* Bus and slot where we are offering the LED dbus service. */
+	sd_bus *bus_type = NULL;
+	sd_bus_slot *led_slot = NULL;
+
+	/* For walking '/sys/class/leds/' looking for names of LED.*/
+	struct dirent **led_list;
+
+	/* Get a hook onto system bus. */
+	rc = sd_bus_open_system(&bus_type);
+	if(rc < 0)
+	{
+		fprintf(stderr,"Error opening system bus.\n");
+		return rc;
+	}
+
+	count_leds = num_leds = scandir("/sys/class/leds/",
+			&led_list, led_select, alphasort);
+	if(num_leds <= 0)
+	{
+		fprintf(stderr,"No LEDs present in the system\n");
+
+		sd_bus_slot_unref(led_slot);
+		sd_bus_unref(bus_type);
+		return rc;
+	}
+
+	/* Install a freedesktop object manager */
+	rc = sd_bus_add_object_manager(bus_type, NULL, led_dbus_root);
+	if(rc < 0) {
+		fprintf(stderr, "Failed to add object to dbus: %s\n",
+				strerror(-rc));
+
+		sd_bus_slot_unref(led_slot);
+		sd_bus_unref(bus_type);
+		return rc;
+	}
+
+	/* Fully qualified Dbus object for a particular LED */
+	char led_object[128] = {0};
+	int len = 0;
+
+	/* For each led present, announce the service on dbus. */
+	while(num_leds--)
+	{
+		memset(led_object, 0x0, sizeof(led_object));
+
+		len = snprintf(led_object, sizeof(led_object), "%s%s%s",
+				led_dbus_root, "/", led_list[num_leds]->d_name);
+
+		if(len >= sizeof(led_object))
+		{
+			fprintf(stderr, "Error. LED object is too long:[%d]\n",len);
+			rc = -1;
+			break;
+		}
+
+		/* Install the object */
+		rc = sd_bus_add_object_vtable(bus_type,
+				&led_slot,
+				led_object, /* object path */
+				"org.openbmc.Led", /* interface name */
+				led_control_vtable,
+				NULL);
+
+		if(rc < 0)
+		{
+			fprintf(stderr, "Failed to add object to dbus: %s\n", strerror(-rc));
+			break;
+		}
+
+		rc = sd_bus_emit_object_added(bus_type, led_object);
+
+		if(rc < 0)
+		{
+			fprintf(stderr, "Failed to emit InterfacesAdded "
+					"signal: %s\n", strerror(-rc));
+			break;
+		}
+	}
+
+	/* Done with all registration. */
+	while(count_leds > 0)
+	{
+		free(led_list[--count_leds]);
+	}
+	free(led_list);
+
+	/* If we had success in adding the providers, request for a bus name. */
+	if(rc >= 0)
+	{
+		/* Take one in OpenBmc */
+		rc = sd_bus_request_name(bus_type, "org.openbmc.control.led", 0);
+		if(rc < 0)
+		{
+			fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-rc));
+		}
+		else
+		{
+			for(;;)
+			{
+				/* Process requests */
+				rc = sd_bus_process(bus_type, NULL);
+				if(rc < 0)
+				{
+					fprintf(stderr, "Failed to process bus: %s\n", strerror(-rc));
+					break;
+				}
+				if(rc > 0)
+				{
+					continue;
+				}
+
+				rc = sd_bus_wait(bus_type, (uint64_t) - 1);
+				if(rc < 0)
+				{
+					fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-rc));
+					break;
+				}
+			}
+		}
+	}
+	sd_bus_slot_unref(led_slot);
+	sd_bus_unref(bus_type);
+
+	return rc;
+}
+
+int
+main(void)
+{
+	int rc = 0;
+
+	/* This call is not supposed to return. If it does, then an error */
+	rc = start_led_services();
+	if(rc < 0)
+	{
+		fprintf(stderr, "Error starting LED Services. Exiting");
+	}
+
+	return rc;
+}
diff --git a/objects/pcie_slot_present_obj.c b/objects/pcie_slot_present_obj.c
index 0cbc2d7..36104e2 100644
--- a/objects/pcie_slot_present_obj.c
+++ b/objects/pcie_slot_present_obj.c
@@ -1,164 +1,163 @@
-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include <stdio.h>

-#include <stdbool.h>

-#include <string.h>

-#include "gpio.h"

-

-#define NUM_SLOTS 8

-GPIO slots[NUM_SLOTS] = {

-	{ "SLOT0_RISER_PRESENT" },

-	{ "SLOT1_RISER_PRESENT" },

-	{ "SLOT2_RISER_PRESENT" },

-	{ "SLOT0_PRESENT" },

-	{ "SLOT1_PRESENT" },

-	{ "SLOT2_PRESENT" },

-	{ "MEZZ0_PRESENT" },

-	{ "MEZZ1_PRESENT" },

-};

-

-typedef struct {

-	const char* bus_name;

-	const char* path;

-	const char* intf_name;

-} object_info;

-	

-

-

-/* ---------------------------------------------------------------------------------------------------- */

-int get_object(GDBusProxy *proxy, GPIO* gpio, object_info* obj_info)

-{

-	g_print("Checking Presence: %s\n",gpio->name);

- 	GError *error;

-	GVariant *parm;

-	GVariant *result;

-

-	error = NULL;

-	parm = g_variant_new("(ss)","GPIO_PRESENT",gpio->name);

-	result = g_dbus_proxy_call_sync (proxy,

-                                   "getObjectFromId",

-				   parm,

-                                   G_DBUS_CALL_FLAGS_NONE,

-                                   -1,

-                                   NULL,

-                                   &error);

-	g_assert_no_error (error);

-

-	GVariantIter *iter = g_variant_iter_new(result);

-	GVariant* v_result = g_variant_iter_next_value(iter);

-

-	g_variant_get(v_result,"(sss)",&obj_info->bus_name,&obj_info->path,&obj_info->intf_name);

-int rc=0;

-	if (strlen(obj_info->bus_name) == 0) {

-		rc = 1;

-	}

-	g_variant_unref(v_result);

-	g_variant_unref(result);

-

-	return rc;

-}

-

-int get_presence(GDBusConnection* connection, GPIO* gpio, uint8_t* present)

-{

-	int rc = GPIO_OK;

-	do {

-		rc = gpio_init(connection,gpio);

-		if (rc != GPIO_OK) { break; }

-		uint8_t gpio_val;

-		rc = gpio_open(gpio);

-		if (rc != GPIO_OK) { break; }

-		rc = gpio_read(gpio,&gpio_val);

-		if (rc != GPIO_OK) { gpio_close(gpio); break; }

-		gpio_close(gpio);

-		*present = gpio_val;	

-	} while(0);

-	if (rc != GPIO_OK)

-	{

-		printf("ERROR pcie_slot_present: GPIO error %s (rc=%d)\n",gpio->name,rc);

-	}

-	return rc; 

-}

-

-void update_fru_obj(GDBusConnection* connection, object_info* obj_info, const char* present)

-{

-	GDBusProxy *proxy;

- 	GError *error;

-	GVariant *parm;

-	GVariant *result;

-

-	error = NULL;

-	proxy = g_dbus_proxy_new_sync (connection,

-                             G_DBUS_PROXY_FLAGS_NONE,

-                             NULL,                      /* GDBusInterfaceInfo* */

-                             obj_info->bus_name, /* name */

-                             obj_info->path, /* object path */

-                             obj_info->intf_name,        /* interface name */

-                             NULL,                      /* GCancellable */

-                             &error);

-	g_assert_no_error (error);

-

-	error = NULL;

-	parm = g_variant_new("(s)",present);

-	

-	result = g_dbus_proxy_call_sync (proxy,

-                                   "setPresent",

-				   parm,

-                                   G_DBUS_CALL_FLAGS_NONE,

-                                   -1,

-                                   NULL,

-                                   &error);

-

-	g_assert_no_error (error);

-}

-

-gint

-main (gint argc, gchar *argv[])

-{

-	GMainLoop *loop;

-	GDBusConnection *c;

-	GDBusProxy *sys_proxy;

- 	GError *error;

-	GVariant *parm;

-	GVariant *result;

-

-	loop = g_main_loop_new (NULL, FALSE);

-

-	error = NULL;

-	c = g_bus_get_sync (DBUS_TYPE, NULL, &error);

-

-	error = NULL;

-	sys_proxy = g_dbus_proxy_new_sync (c,

-                             G_DBUS_PROXY_FLAGS_NONE,

-                             NULL,                      /* GDBusInterfaceInfo* */

-                             "org.openbmc.managers.System", /* name */

-                             "/org/openbmc/managers/System", /* object path */

-                             "org.openbmc.managers.System",        /* interface name */

-                             NULL,                      /* GCancellable */

-                             &error);

-	g_assert_no_error (error);

-

-	int i = 0;

-	int rc = 0;	

-	for (i=0;i<NUM_SLOTS;i++)

-	{

-		object_info obj_info;

-		uint8_t present;

-		char* chr_present;

-		do {

-			rc = get_object(sys_proxy,&slots[i],&obj_info);

-			if (rc) { break; }

-			rc = get_presence(c,&slots[i],&present);

-			//if (rc) { break; }

-			// TODO: send correct state

-			if (present == 0) {

-				update_fru_obj(c,&obj_info,"True");

-			} else {

-				update_fru_obj(c,&obj_info,"False");

-			}

-		} while(0);

-	}

-

-	g_object_unref(c);

- 	g_main_loop_unref (loop);

- 	return 0;

-}

+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include "gpio.h"
+
+#define NUM_SLOTS 8
+GPIO slots[NUM_SLOTS] = {
+	{ "SLOT0_RISER_PRESENT" },
+	{ "SLOT1_RISER_PRESENT" },
+	{ "SLOT2_RISER_PRESENT" },
+	{ "SLOT0_PRESENT" },
+	{ "SLOT1_PRESENT" },
+	{ "SLOT2_PRESENT" },
+	{ "MEZZ0_PRESENT" },
+	{ "MEZZ1_PRESENT" },
+};
+
+typedef struct {
+	const char* bus_name;
+	const char* path;
+	const char* intf_name;
+} object_info;
+
+
+
+/* ------------------------------------------------------------------------- */
+int
+get_object(GDBusProxy *proxy, GPIO* gpio, object_info* obj_info)
+{
+	g_print("Checking Presence: %s\n",gpio->name);
+	GError *error;
+	GVariant *parm;
+	GVariant *result;
+
+	error = NULL;
+	parm = g_variant_new("(ss)","GPIO_PRESENT",gpio->name);
+	result = g_dbus_proxy_call_sync(proxy,
+			"getObjectFromId",
+			parm,
+			G_DBUS_CALL_FLAGS_NONE,
+			-1,
+			NULL,
+			&error);
+	g_assert_no_error(error);
+
+	GVariantIter *iter = g_variant_iter_new(result);
+	GVariant* v_result = g_variant_iter_next_value(iter);
+
+	g_variant_get(v_result,"(sss)",&obj_info->bus_name,&obj_info->path,&obj_info->intf_name);
+	int rc=0;
+	if(strlen(obj_info->bus_name) == 0) {
+		rc = 1;
+	}
+	g_variant_unref(v_result);
+	g_variant_unref(result);
+
+	return rc;
+}
+
+int
+get_presence(GDBusConnection* connection, GPIO* gpio, uint8_t* present)
+{
+	int rc = GPIO_OK;
+	do {
+		rc = gpio_init(connection,gpio);
+		if(rc != GPIO_OK) { break; }
+		uint8_t gpio_val;
+		rc = gpio_open(gpio);
+		if(rc != GPIO_OK) { break; }
+		rc = gpio_read(gpio,&gpio_val);
+		if(rc != GPIO_OK) { gpio_close(gpio); break; }
+		gpio_close(gpio);
+		*present = gpio_val;
+	} while(0);
+	if(rc != GPIO_OK)
+	{
+		printf("ERROR pcie_slot_present: GPIO error %s (rc=%d)\n",gpio->name,rc);
+	}
+	return rc;
+}
+
+void
+update_fru_obj(GDBusConnection* connection, object_info* obj_info, const char* present)
+{
+	GDBusProxy *proxy;
+	GError *error;
+	GVariant *parm;
+
+	error = NULL;
+	proxy = g_dbus_proxy_new_sync(connection,
+			G_DBUS_PROXY_FLAGS_NONE,
+			NULL, /* GDBusInterfaceInfo* */
+			obj_info->bus_name, /* name */
+			obj_info->path, /* object path */
+			obj_info->intf_name, /* interface name */
+			NULL, /* GCancellable */
+			&error);
+	g_assert_no_error(error);
+
+	error = NULL;
+	parm = g_variant_new("(s)",present);
+
+	g_dbus_proxy_call_sync(proxy,
+			"setPresent",
+			parm,
+			G_DBUS_CALL_FLAGS_NONE,
+			-1,
+			NULL,
+			&error);
+
+	g_assert_no_error(error);
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	GDBusConnection *c;
+	GDBusProxy *sys_proxy;
+	GError *error;
+
+	loop = g_main_loop_new(NULL, FALSE);
+
+	error = NULL;
+	c = g_bus_get_sync(DBUS_TYPE, NULL, &error);
+
+	error = NULL;
+	sys_proxy = g_dbus_proxy_new_sync(c,
+			G_DBUS_PROXY_FLAGS_NONE,
+			NULL, /* GDBusInterfaceInfo* */
+			"org.openbmc.managers.System", /* name */
+			"/org/openbmc/managers/System", /* object path */
+			"org.openbmc.managers.System", /* interface name */
+			NULL, /* GCancellable */
+			&error);
+	g_assert_no_error(error);
+
+	int i = 0;
+	int rc = 0;
+	for(i=0;i<NUM_SLOTS;i++)
+	{
+		object_info obj_info;
+		uint8_t present;
+		do {
+			rc = get_object(sys_proxy,&slots[i],&obj_info);
+			if(rc) { break; }
+			rc = get_presence(c,&slots[i],&present);
+			//if (rc) { break; }
+			// TODO: send correct state
+			if(present == 0) {
+				update_fru_obj(c,&obj_info,"True");
+			} else {
+				update_fru_obj(c,&obj_info,"False");
+			}
+		} while(0);
+	}
+
+	g_object_unref(c);
+	g_main_loop_unref(loop);
+	return 0;
+}
diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
index a7abba4..85a8cff 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -1,324 +1,309 @@
-#include <stdint.h>

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <fcntl.h>

-#include <unistd.h>

-#include <sys/stat.h>

-#include <sys/mman.h>

-#include <syslog.h>

-#include "interfaces/openbmc_intf.h"

-#include "openbmc.h"

-#include "gpio.h"

-#include "object_mapper.h"

-

-/* ---------------------------------------------------------------------------------------------------- */

-static const gchar* dbus_object_path = "/org/openbmc/control";

-static const gchar* instance_name = "power0";

-static const gchar* dbus_name        = "org.openbmc.control.Power";

-

-//This object will use these GPIOs

-GPIO power_pin    = (GPIO){ "POWER_PIN" };

-GPIO pgood        = (GPIO){ "PGOOD" };

-GPIO usb_reset    = (GPIO){ "USB_RESET" };

-GPIO pcie_reset   = (GPIO){ "PCIE_RESET" };

-

-

-static GDBusObjectManagerServer *manager = NULL;

-

-time_t pgood_timeout_start = 0;

-

-// TODO:  Change to interrupt driven instead of polling

-static gboolean poll_pgood(gpointer user_data)

-{

-	ControlPower *control_power = object_get_control_power((Object*)user_data);

-	Control* control = object_get_control((Object*)user_data);

-

-	//send the heartbeat

-	const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);

-

-	guint poll_int = control_get_poll_interval(control);

-	if (poll_int == 0)

-	{

-		printf("ERROR PowerControl: Poll interval cannot be 0\n");

-		return FALSE;

-	}

-	//handle timeout

-	time_t current_time = time(NULL);

-	if (difftime(current_time,pgood_timeout_start) > control_power_get_pgood_timeout(control_power)

-		&& pgood_timeout_start != 0)

-	{

-		printf("ERROR PowerControl: Pgood poll timeout\n");

-		// set timeout to 0 so timeout doesn't happen again

-		control_power_set_pgood_timeout(control_power,0);

-		pgood_timeout_start = 0;

-		return TRUE;

-	}

-	uint8_t gpio;

-	

-	int rc = gpio_open(&pgood);

-	rc = gpio_read(&pgood,&gpio);

-	gpio_close(&pgood);	

-	if (rc == GPIO_OK)

-	{

-		//if changed, set property and emit signal

-		if (gpio != control_power_get_pgood(control_power))

-		{

- 			control_power_set_pgood(control_power,gpio);

- 			if (gpio==0)

- 			{

- 				control_power_emit_power_lost(control_power);

-				control_emit_goto_system_state(control,"HOST_POWERED_OFF");

-				rc = gpio_open(&pcie_reset);

-				rc = gpio_write(&pcie_reset,0);

-				gpio_close(&pcie_reset);

-

-				rc = gpio_open(&usb_reset);

-				rc = gpio_write(&usb_reset,0);

-				gpio_close(&usb_reset);		

-

- 			}

- 			else

- 			{

- 				control_power_emit_power_good(control_power);

-				control_emit_goto_system_state(control,"HOST_POWERED_ON");

-				rc = gpio_open(&pcie_reset);

-				rc = gpio_write(&pcie_reset,1);

-				gpio_close(&pcie_reset);

-

-				rc = gpio_open(&usb_reset);

-				rc = gpio_write(&usb_reset,1);

-				gpio_close(&usb_reset);		

- 			}

-		}

-	} else {

-		printf("ERROR PowerControl: GPIO read error (gpio=%s,rc=%d)\n",pgood.name,rc);

-		//return false so poll won't get called anymore

-		return FALSE;

-	}

-	//pgood is not at desired state yet

-	if (gpio != control_power_get_state(control_power) &&

-		control_power_get_pgood_timeout(control_power) > 0)

-	{

-		if (pgood_timeout_start == 0 ) {

-			pgood_timeout_start = current_time;

-		}

-	}

-	else 

-	{

-		pgood_timeout_start = 0;

-	}

-	return TRUE;

-}

-

-

-

-static gboolean

-on_set_power_state (ControlPower          *pwr,

-                GDBusMethodInvocation  *invocation,

-                guint                   state,

-                gpointer                user_data)

-{

-	Control* control = object_get_control((Object*)user_data);

-	const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);

-	if (state > 1)

-	{

-		g_dbus_method_invocation_return_dbus_error (invocation,

-                                                "org.openbmc.ControlPower.Error.Failed",

-                                                "Invalid power state");

-		return TRUE;

-	}

-	// return from method call

-	control_power_complete_set_power_state(pwr,invocation);

-	if (state == control_power_get_state(pwr))

-	{

-		g_print("Power already at requested state: %d\n",state);

-	}

-	else

-	{

-		int error = 0;

-		do {

-			if (state == 1) {

-				control_emit_goto_system_state(control,"HOST_POWERING_ON");

-			} else {

-				control_emit_goto_system_state(control,"HOST_POWERING_OFF");

-			}

-			error = gpio_open(&power_pin);

-			if (error != GPIO_OK) { break;	}

-			error = gpio_write(&power_pin,!state);

-			if (error != GPIO_OK) { break;	}

-			gpio_close(&power_pin);

-			control_power_set_state(pwr,state);

-		} while(0);

-		if (error != GPIO_OK)

-		{

-			printf("ERROR PowerControl: GPIO set power state (rc=%d)\n",error);

-		}

-	}

-	return TRUE;

-}

-

-static gboolean

-on_init (Control         *control,

-         GDBusMethodInvocation  *invocation,

-         gpointer                user_data)

-{

-	pgood_timeout_start = 0;

-	//guint poll_interval = control_get_poll_interval(control);

-	//g_timeout_add(poll_interval, poll_pgood, user_data);

-	control_complete_init(control,invocation);

-	return TRUE;

-}

-

-static gboolean

-on_get_power_state (ControlPower          *pwr,

-                GDBusMethodInvocation  *invocation,

-                gpointer                user_data)

-{

-	guint pgood = control_power_get_pgood(pwr);

-	control_power_complete_get_power_state(pwr,invocation,pgood);

-	return TRUE;

-}

-

-static void 

-on_bus_acquired (GDBusConnection *connection,

-                 const gchar     *name,

-                 gpointer         user_data)

-{

-	ObjectSkeleton *object;

- 	cmdline *cmd = user_data;

-	if (cmd->argc < 3)

-	{

-		g_print("Usage: power_control.exe [poll interval] [timeout]\n");

-		return;

-	}	

-  	manager = g_dbus_object_manager_server_new (dbus_object_path);

-	gchar *s;

-  	s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);

-  	object = object_skeleton_new (s);

-  	g_free (s);

-

-	ControlPower* control_power = control_power_skeleton_new ();

-	object_skeleton_set_control_power (object, control_power);

-	g_object_unref (control_power);

-	

-	Control* control = control_skeleton_new ();

-	object_skeleton_set_control (object, control);

-	g_object_unref (control);

-

-	ObjectMapper* mapper = object_mapper_skeleton_new ();

-	object_skeleton_set_object_mapper (object, mapper);

-	g_object_unref (mapper);

-

-	//define method callbacks here

-	g_signal_connect (control_power,

-       	            "handle-set-power-state",

-               	    G_CALLBACK (on_set_power_state),

-               	    object); /* user_data */

-

-	g_signal_connect (control_power,

-               	    "handle-get-power-state",

-               	    G_CALLBACK (on_get_power_state),

-               	    NULL); /* user_data */

-

-	g_signal_connect (control,

-               	    "handle-init",

-               	    G_CALLBACK (on_init),

-               	    object); /* user_data */

-

-

-	/* Export the object (@manager takes its own reference to @object) */

-	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

-	g_object_unref (object);

-

-	/* Export all objects */

-	g_dbus_object_manager_server_set_connection (manager, connection);

-

-	// 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; }

-		rc = gpio_init(connection,&pcie_reset);

-		if (rc != GPIO_OK) { break; }

-		rc = gpio_init(connection,&usb_reset);

-		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);

-		control_power_set_state(control_power,gpio);

-		printf("Pgood state: %d\n",gpio);

-

-	} while(0);

-	if (rc != GPIO_OK)

-	{

-		printf("ERROR PowerControl: GPIO setup (rc=%d)\n",rc);

-	}

-	//start poll

-	pgood_timeout_start = 0;

-	int poll_interval = atoi(cmd->argv[1]);

-	int pgood_timeout = atoi(cmd->argv[2]);

-	if (poll_interval < 1000 || pgood_timeout <5) {

-		printf("ERROR PowerControl: poll_interval < 1000 or pgood_timeout < 5\n");

-	} else {

-		control_set_poll_interval(control,poll_interval);

-		control_power_set_pgood_timeout(control_power,pgood_timeout);

-		g_timeout_add(poll_interval, poll_pgood, object);

-	}

-	emit_object_added((GDBusObjectManager*)manager);  

-}

-

-static void

-on_name_acquired (GDBusConnection *connection,

-                  const gchar     *name,

-                  gpointer         user_data)

-{

-}

-

-static void

-on_name_lost (GDBusConnection *connection,

-              const gchar     *name,

-              gpointer         user_data)

-{

-}

-

-

-

-

-/*----------------------------------------------------------------*/

-/* Main Event Loop                                                */

-

-gint

-main (gint argc, gchar *argv[])

-{

-  GMainLoop *loop;

-  cmdline cmd;

-  cmd.argc = argc;

-  cmd.argv = argv;

-

-  guint id;

-  loop = g_main_loop_new (NULL, FALSE);

-

-  id = g_bus_own_name (DBUS_TYPE,

-                       dbus_name,

-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |

-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,

-                       on_bus_acquired,

-                       on_name_acquired,

-                       on_name_lost,

-                       &cmd,

-                       NULL);

-

-   g_main_loop_run (loop);

-  

-  g_bus_unown_name (id);

-  g_main_loop_unref (loop);

-  return 0;

-}

+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <syslog.h>
+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+#include "gpio.h"
+
+/* ------------------------------------------------------------------------- */
+static const gchar* dbus_object_path = "/org/openbmc/control";
+static const gchar* instance_name = "power0";
+static const gchar* dbus_name = "org.openbmc.control.Power";
+
+//This object will use these GPIOs
+GPIO power_pin    = (GPIO){ "POWER_PIN" };
+GPIO pgood        = (GPIO){ "PGOOD" };
+GPIO usb_reset    = (GPIO){ "USB_RESET" };
+GPIO pcie_reset   = (GPIO){ "PCIE_RESET" };
+
+
+static GDBusObjectManagerServer *manager = NULL;
+
+time_t pgood_timeout_start = 0;
+
+// TODO:  Change to interrupt driven instead of polling
+static gboolean
+poll_pgood(gpointer user_data)
+{
+	ControlPower *control_power = object_get_control_power((Object*)user_data);
+	Control* control = object_get_control((Object*)user_data);
+
+	//send the heartbeat
+	guint poll_int = control_get_poll_interval(control);
+	if(poll_int == 0)
+	{
+		printf("ERROR PowerControl: Poll interval cannot be 0\n");
+		return FALSE;
+	}
+	//handle timeout
+	time_t current_time = time(NULL);
+	if(difftime(current_time,pgood_timeout_start) > control_power_get_pgood_timeout(control_power)
+			&& pgood_timeout_start != 0)
+	{
+		printf("ERROR PowerControl: Pgood poll timeout\n");
+		// set timeout to 0 so timeout doesn't happen again
+		control_power_set_pgood_timeout(control_power,0);
+		pgood_timeout_start = 0;
+		return TRUE;
+	}
+	uint8_t gpio;
+
+	int rc = gpio_open(&pgood);
+	rc = gpio_read(&pgood,&gpio);
+	gpio_close(&pgood);
+	if(rc == GPIO_OK)
+	{
+		//if changed, set property and emit signal
+		if(gpio != control_power_get_pgood(control_power))
+		{
+			control_power_set_pgood(control_power,gpio);
+			if(gpio==0)
+			{
+				control_power_emit_power_lost(control_power);
+				control_emit_goto_system_state(control,"HOST_POWERED_OFF");
+				rc = gpio_open(&pcie_reset);
+				rc = gpio_write(&pcie_reset,0);
+				gpio_close(&pcie_reset);
+
+				rc = gpio_open(&usb_reset);
+				rc = gpio_write(&usb_reset,0);
+				gpio_close(&usb_reset);
+
+			}
+			else
+			{
+				control_power_emit_power_good(control_power);
+				control_emit_goto_system_state(control,"HOST_POWERED_ON");
+				rc = gpio_open(&pcie_reset);
+				rc = gpio_write(&pcie_reset,1);
+				gpio_close(&pcie_reset);
+
+				rc = gpio_open(&usb_reset);
+				rc = gpio_write(&usb_reset,1);
+				gpio_close(&usb_reset);
+			}
+		}
+	} else {
+		printf("ERROR PowerControl: GPIO read error (gpio=%s,rc=%d)\n",pgood.name,rc);
+		//return false so poll won't get called anymore
+		return FALSE;
+	}
+	//pgood is not at desired state yet
+	if(gpio != control_power_get_state(control_power) &&
+			control_power_get_pgood_timeout(control_power) > 0)
+	{
+		if(pgood_timeout_start == 0 ) {
+			pgood_timeout_start = current_time;
+		}
+	}
+	else
+	{
+		pgood_timeout_start = 0;
+	}
+	return TRUE;
+}
+
+static gboolean
+on_set_power_state(ControlPower *pwr,
+		GDBusMethodInvocation *invocation,
+		guint state,
+		gpointer user_data)
+{
+	Control* control = object_get_control((Object*)user_data);
+	if(state > 1)
+	{
+		g_dbus_method_invocation_return_dbus_error(invocation,
+				"org.openbmc.ControlPower.Error.Failed",
+				"Invalid power state");
+		return TRUE;
+	}
+	// return from method call
+	control_power_complete_set_power_state(pwr,invocation);
+	if(state == control_power_get_state(pwr))
+	{
+		g_print("Power already at requested state: %d\n",state);
+	}
+	else
+	{
+		int error = 0;
+		do {
+			if(state == 1) {
+				control_emit_goto_system_state(control,"HOST_POWERING_ON");
+			} else {
+				control_emit_goto_system_state(control,"HOST_POWERING_OFF");
+			}
+			error = gpio_open(&power_pin);
+			if(error != GPIO_OK) { break;	}
+			error = gpio_write(&power_pin,!state);
+			if(error != GPIO_OK) { break;	}
+			gpio_close(&power_pin);
+			control_power_set_state(pwr,state);
+		} while(0);
+		if(error != GPIO_OK)
+		{
+			printf("ERROR PowerControl: GPIO set power state (rc=%d)\n",error);
+		}
+	}
+	return TRUE;
+}
+
+static gboolean
+on_init(Control *control,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	pgood_timeout_start = 0;
+	//guint poll_interval = control_get_poll_interval(control);
+	//g_timeout_add(poll_interval, poll_pgood, user_data);
+	control_complete_init(control,invocation);
+	return TRUE;
+}
+
+static gboolean
+on_get_power_state(ControlPower *pwr,
+		GDBusMethodInvocation *invocation,
+		gpointer user_data)
+{
+	guint pgood = control_power_get_pgood(pwr);
+	control_power_complete_get_power_state(pwr,invocation,pgood);
+	return TRUE;
+}
+
+static void
+on_bus_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+	ObjectSkeleton *object;
+	cmdline *cmd = user_data;
+	if(cmd->argc < 3)
+	{
+		g_print("Usage: power_control.exe [poll interval] [timeout]\n");
+		return;
+	}
+	manager = g_dbus_object_manager_server_new(dbus_object_path);
+	gchar *s;
+	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
+	object = object_skeleton_new(s);
+	g_free(s);
+
+	ControlPower* control_power = control_power_skeleton_new();
+	object_skeleton_set_control_power(object, control_power);
+	g_object_unref(control_power);
+
+	Control* control = control_skeleton_new();
+	object_skeleton_set_control(object, control);
+	g_object_unref(control);
+
+	//define method callbacks here
+	g_signal_connect(control_power,
+			"handle-set-power-state",
+			G_CALLBACK(on_set_power_state),
+			object); /* user_data */
+
+	g_signal_connect(control_power,
+			"handle-get-power-state",
+			G_CALLBACK(on_get_power_state),
+			NULL); /* user_data */
+
+	g_signal_connect(control,
+			"handle-init",
+			G_CALLBACK(on_init),
+			object); /* user_data */
+
+
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_set_connection(manager, connection);
+	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
+	g_object_unref(object);
+
+	// 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; }
+		rc = gpio_init(connection,&pcie_reset);
+		if(rc != GPIO_OK) { break; }
+		rc = gpio_init(connection,&usb_reset);
+		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);
+		control_power_set_state(control_power,gpio);
+		printf("Pgood state: %d\n",gpio);
+
+	} while(0);
+	if(rc != GPIO_OK)
+	{
+		printf("ERROR PowerControl: GPIO setup (rc=%d)\n",rc);
+	}
+	//start poll
+	pgood_timeout_start = 0;
+	int poll_interval = atoi(cmd->argv[1]);
+	int pgood_timeout = atoi(cmd->argv[2]);
+	if(poll_interval < 1000 || pgood_timeout <5) {
+		printf("ERROR PowerControl: poll_interval < 1000 or pgood_timeout < 5\n");
+	} else {
+		control_set_poll_interval(control,poll_interval);
+		control_power_set_pgood_timeout(control_power,pgood_timeout);
+		g_timeout_add(poll_interval, poll_pgood, object);
+	}
+}
+
+static void
+on_name_acquired(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+static void
+on_name_lost(GDBusConnection *connection,
+		const gchar *name,
+		gpointer user_data)
+{
+}
+
+/*----------------------------------------------------------------*/
+/* Main Event Loop                                                */
+
+gint
+main(gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	cmdline cmd;
+	cmd.argc = argc;
+	cmd.argv = argv;
+
+	guint id;
+	loop = g_main_loop_new(NULL, FALSE);
+
+	id = g_bus_own_name(DBUS_TYPE,
+			dbus_name,
+			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+			G_BUS_NAME_OWNER_FLAGS_REPLACE,
+			on_bus_acquired,
+			on_name_acquired,
+			on_name_lost,
+			&cmd,
+			NULL);
+
+	g_main_loop_run(loop);
+
+	g_bus_unown_name(id);
+	g_main_loop_unref(loop);
+	return 0;
+}