[devmgr] composite device part 3
Change-Id: I55f8ba240d36a2553e80e68bbc842e0c2fb344f4
diff --git a/system/core/devmgr/devmgr-binding.c b/system/core/devmgr/devmgr-binding.c
index a3eb1a3..409d4b3 100644
--- a/system/core/devmgr/devmgr-binding.c
+++ b/system/core/devmgr/devmgr-binding.c
@@ -150,7 +150,7 @@
ctx.binding = binding->bindings;
ctx.binding_size = binding->bindcount * sizeof(zx_bind_inst_t);
ctx.name = "dependency";
- ctx.autobind = 1;
+ ctx.autobind = 0;
return is_bindable(&ctx);
}
diff --git a/system/core/devmgr/devmgr-coordinator.c b/system/core/devmgr/devmgr-coordinator.c
index 6b458a0..cc8e675 100644
--- a/system/core/devmgr/devmgr-coordinator.c
+++ b/system/core/devmgr/devmgr-coordinator.c
@@ -386,7 +386,8 @@
device_t* dev = containerof(work, device_t, work);
dc_handle_new_device(dev);
// check if the new device satisfied any pending composite devices
- list_for_every_entry(&list_devices_pending, dev, device_t, anode) {
+ device_t* temp;
+ list_for_every_entry_safe(&list_devices_pending, dev, temp, device_t, anode) {
dc_handle_new_composite_device(dev);
}
break;
@@ -696,7 +697,9 @@
dev->deps = deps;
src = data + msg->datalen + sizeof(uint32_t);
for (i = 0; i < dep_count; i++) {
- memcpy(&deps->bindcount, src, sizeof(uint32_t));
+ len = sizeof(uint32_t);
+ memcpy(&deps->bindcount, src, len);
+ src += len;
deps->bindings = (zx_bind_inst_t*)dst;
len = deps->bindcount * sizeof(zx_bind_inst_t);
memcpy(dst, src, len);
@@ -1452,10 +1455,12 @@
device_t* other;
satisfied = false;
list_for_every_entry(&list_devices, other, device_t, anode) {
- if (dc_is_bindable(&dev->deps[i], other->protocol_id,
+ if (other->protocol_id == ZX_PROTOCOL_I2C_BUS) {
+ //printf("devcoord: dev='%s' satisfies dependency %u for dev='%s'?\n",
+ // other->name, i, dev->name);
+ }
+ if (dc_is_bindable(dev->deps + i, other->protocol_id,
other->props, other->prop_count)) {
- log(SPEW, "devcoord: dev='%s' satisfies dependency %u for dev='%s'\n",
- other->name, i, dev->name);
satisfied = true;
}
}
@@ -1464,6 +1469,13 @@
}
}
printf("devcoord: dependencies for dev='%s' satisfied %d\n", dev->name, satisfied);
+ if (satisfied) {
+ list_delete(&dev->anode);
+ list_add_tail(&list_devices, &dev->anode);
+ devfs_advertise(dev);
+ dc_notify(dev, DEVMGR_OP_DEVICE_ADDED);
+ dc_handle_new_device(dev);
+ }
}
// device binding program that pure (parentless)
diff --git a/system/dev/bus/acpi/bus-acpi.c b/system/dev/bus/acpi/bus-acpi.c
index 520d568..0f36c75 100644
--- a/system/dev/bus/acpi/bus-acpi.c
+++ b/system/dev/bus/acpi/bus-acpi.c
@@ -556,14 +556,12 @@
}
// BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_I2C_BUS)
- binding->bindings[0].op = BINDINST_CC(COND_NE) | BINDINST_OP(OP_ABORT) |
- BINDINST_PB(BIND_PROTOCOL);
+ binding->bindings[0].op = (COND_NE << 28) | (OP_ABORT << 24) | BINDINST_PB(BIND_PROTOCOL);
binding->bindings[0].arg = ZX_PROTOCOL_I2C_BUS;
// BI_MATCH_IF(NE, BIND_PCI_BDF_ADDR, <b:d.f>)
// TODO Only support a single PCI bus for now
- binding->bindings[1].op = BINDINST_CC(COND_EQ) | BINDINST_OP(OP_MATCH) |
- BINDINST_PB(BIND_PCI_BDF_ADDR);
+ binding->bindings[1].op = (COND_EQ << 28) | (OP_MATCH << 24) | BINDINST_PB(BIND_PCI_BDF_ADDR);
binding->bindings[1].arg = BIND_PCI_BDF_PACK(0, (addr >> 16), (addr & 0xffff));
binding->bindcount = 2;
diff --git a/system/ulib/ddk/include/ddk/protodefs.h b/system/ulib/ddk/include/ddk/protodefs.h
index 784e6eb..15a7461 100644
--- a/system/ulib/ddk/include/ddk/protodefs.h
+++ b/system/ulib/ddk/include/ddk/protodefs.h
@@ -53,6 +53,7 @@
DDK_PROTOCOL_DEF(TEST, 'pTST', "test", 0)
DDK_PROTOCOL_DEF(PLATFORM_BUS, 'pPBU', "platform-bus", 0)
DDK_PROTOCOL_DEF(PLATFORM_DEV, 'pPDV', "platform-dev", 0)
+// TODO different than I2C to not conflict with platform-bus work for now
DDK_PROTOCOL_DEF(I2C_BUS, 'pI2B', "i2c-bus", 0)
DDK_PROTOCOL_DEF(I2C_HID, 'pIHD', "i2c-hid", 0)
// Protocol definition at garnet/magma/src/magma_util/platform/zircon/zircon_platform_ioctl.h