Increase drive strength, fix driver binding, add logging
Change-Id: I3d7dd5e163841c54bbcd967e74905a784f1d8322
diff --git a/boards/vim3.gni b/boards/vim3.gni
index bae9308..4d781ff 100644
--- a/boards/vim3.gni
+++ b/boards/vim3.gni
@@ -42,6 +42,7 @@
board_system_image_deps += [
"//garnet/packages/prod:magma-arm-mali-system",
"//garnet/packages/prod:magma-vsi-vip",
+ "//src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac:brcmfmac-sherlock",
"//src/media/drivers/amlogic_decoder",
]
diff --git a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
index bde93f6..ee284f6 100644
--- a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
+++ b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
@@ -110,18 +110,39 @@
if (rxd_err) {
if (req->probe_tuning_cmd) {
- AML_SDMMC_ERROR("RX Data CRC Error cmd%d, status=0x%x, RXD_ERR:%d", req->cmd_idx,
- status_irq.reg_value(), rxd_err);
+
+ AML_SDMMC_TRACE("RX Data CRC Error cmd%d (%zu), arg=0x%08x, status=0x%08x", req->cmd_idx,
+ request_count_, req->arg, status_irq.reg_value());
} else {
AML_SDMMC_ERROR("RX Data CRC Error cmd%d, status=0x%x, RXD_ERR:%d", req->cmd_idx,
status_irq.reg_value(), rxd_err);
+ AML_SDMMC_ERROR("Current: 0x%08x 0x%08x 0x%08x 0x%08x",
+ AmlSdmmcCurCfg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcCurArg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcCurDat::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcCurResp::Get().ReadFrom(&mmio_).reg_value());
+ AML_SDMMC_ERROR("Next: 0x%08x 0x%08x 0x%08x 0x%08x",
+ AmlSdmmcNextCfg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcNextArg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcNextDat::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcNextResp::Get().ReadFrom(&mmio_).reg_value());
}
return ZX_ERR_IO_DATA_INTEGRITY;
}
if (status_irq.txd_err()) {
- AML_SDMMC_ERROR("TX Data CRC Error, cmd%d, status=0x%x TXD_ERR", req->cmd_idx,
- status_irq.reg_value());
- return ZX_ERR_IO_DATA_INTEGRITY;
+ AML_SDMMC_ERROR("TX Data CRC Error, cmd%d (%zu), arg=0x%08x, status=0x%08x", req->cmd_idx,
+ request_count_, req->arg, status_irq.reg_value());
+ AML_SDMMC_ERROR("Current: 0x%08x 0x%08x 0x%08x 0x%08x",
+ AmlSdmmcCurCfg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcCurArg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcCurDat::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcCurResp::Get().ReadFrom(&mmio_).reg_value());
+ AML_SDMMC_ERROR("Next: 0x%08x 0x%08x 0x%08x 0x%08x",
+ AmlSdmmcNextCfg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcNextArg::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcNextDat::Get().ReadFrom(&mmio_).reg_value(),
+ AmlSdmmcNextResp::Get().ReadFrom(&mmio_).reg_value());
+ return ZX_ERR_IO_DATA_INTEGRITY;
}
if (status_irq.desc_err()) {
AML_SDMMC_ERROR("Controller does not own the descriptor, cmd%d, status=0x%x", req->cmd_idx,
@@ -373,6 +394,7 @@
.set_resp_timeout(AmlSdmmcCfg::kDefaultRespTimeout)
.set_rc_cc(AmlSdmmcCfg::kDefaultRcCc)
.set_bus_width(AmlSdmmcCfg::kBusWidth1Bit)
+ // .set_auto_clk(1)
.reg_value();
AmlSdmmcCfg::Get().ReadFrom(&mmio_).set_reg_value(config_val).WriteTo(&mmio_);
AmlSdmmcStatus::Get()
@@ -976,7 +998,7 @@
}
ClearStatus();
-
+ request_count_++;
start_reg.set_desc_busy(1).set_desc_addr((static_cast<uint32_t>(desc_phys)) >> 2).WriteTo(&mmio_);
zx_status_t res = WaitForInterrupt(req);
diff --git a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h
index 6af7223..e9c34c2 100644
--- a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h
+++ b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h
@@ -152,6 +152,7 @@
std::atomic<bool> dead_ TA_GUARDED(mtx_);
std::atomic<bool> pending_txn_ TA_GUARDED(mtx_);
std::optional<SdmmcVmoStore> registered_vmos_[SDMMC_MAX_CLIENT_ID + 1];
+ size_t request_count_ = 0;
};
} // namespace sdmmc
diff --git a/src/devices/board/drivers/vim3/vim3-sd.cc b/src/devices/board/drivers/vim3/vim3-sd.cc
index 04e7b24..cb8c0e7 100644
--- a/src/devices/board/drivers/vim3/vim3-sd.cc
+++ b/src/devices/board/drivers/vim3/vim3-sd.cc
@@ -53,16 +53,12 @@
},
};
-static const zx_bind_inst_t root_match[] = {
- BI_MATCH(),
-};
static const zx_bind_inst_t i2c_match[] = {
BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_I2C),
BI_ABORT_IF(NE, BIND_I2C_BUS_ID, 0),
BI_MATCH_IF(EQ, BIND_I2C_ADDRESS, 0x20),
};
static const device_fragment_part_t i2c_fragment[] = {
- {countof(root_match), root_match},
{countof(i2c_match), i2c_match},
};
static const device_fragment_t fragments[] = {
@@ -86,15 +82,12 @@
BI_MATCH_IF(EQ, BIND_GPIO_PIN, A311D_GPIOC(6)), // CD pin
};
static const device_fragment_part_t sdio_fn1_fragment[] = {
- {std::size(root_match), root_match},
{std::size(sdio_fn1_match), sdio_fn1_match},
};
static const device_fragment_part_t sdio_fn2_fragment[] = {
- {std::size(root_match), root_match},
{std::size(sdio_fn2_match), sdio_fn2_match},
};
static const device_fragment_part_t oob_gpio_fragment[] = {
- {std::size(root_match), root_match},
{std::size(oob_gpio_match), oob_gpio_match},
};
static const device_fragment_t wifi_fragments[] = {
@@ -127,6 +120,13 @@
gpio_impl_.SetAltFunction(A311D_GPIOC(4), A311D_GPIOC_4_SDCARD_CLK_FN);
gpio_impl_.SetAltFunction(A311D_GPIOC(5), A311D_GPIOC_5_SDCARD_CMD_FN);
+ gpio_impl_.SetDriveStrength(A311D_GPIOC(0), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(1), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(2), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(3), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(4), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(5), 4000, nullptr);
+
if ((status = pbus_.CompositeDeviceAdd(&sd_dev, reinterpret_cast<uint64_t>(fragments),
countof(fragments), UINT32_MAX)) != ZX_OK) {
zxlogf(ERROR, "SdInit could not add sd_dev: %d", status);