Merge "Replace bootp with dhcp."
diff --git a/src/drivers/storage/mmc.c b/src/drivers/storage/mmc.c
index b413097..aca9f96 100644
--- a/src/drivers/storage/mmc.c
+++ b/src/drivers/storage/mmc.c
@@ -933,6 +933,10 @@
}
mmc_set_clock(mmc, clock);
mmc->lba = mmc->capacity / mmc->read_bl_len;
+ if (mmc->block_dev) {
+ mmc->block_dev->block_count = mmc->lba;
+ mmc->block_dev->block_size = mmc->read_bl_len;
+ }
return 0;
}
@@ -959,13 +963,6 @@
return 0;
}
-int mmc_register(MmcDevice *mmc)
-{
- if (!mmc->b_max)
- mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
- return 0;
-}
-
int mmc_start_init(MmcDevice *mmc)
{
int err;
@@ -1044,10 +1041,46 @@
}
/////////////////////////////////////////////////////////////////////////////
-// BlockDevice callbacks
+// BlockDevice utilities and callbacks
-lba_t block_mmc_read(struct BlockDev *dev, lba_t start, lba_t count,
- void *buffer)
+void block_mmc_refresh(ListNode *block_node, MmcDevice *mmc)
+{
+ assert(mmc && mmc->block_dev);
+ debug("%s: %s\n",mmc->block_dev->name, __func__);
+ if (mmc->has_init) {
+ list_remove(&mmc->block_dev->list_node);
+ mmc->has_init = 0;
+ }
+ if (mmc_init(mmc) == 0) {
+ list_insert_after(&mmc->block_dev->list_node, block_node);
+ printf("%s: %s: Card present.\n", __func__,
+ mmc->block_dev->name);
+ } else {
+ printf("%s: %s: No card present.\n", __func__,
+ mmc->block_dev->name);
+ }
+}
+
+int block_mmc_register(BlockDev *dev, MmcDevice *mmc, MmcDevice **root)
+{
+ if (!mmc->b_max)
+ mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
+ mmc->block_dev = dev;
+ dev->dev_data = mmc;
+ dev->read = block_mmc_read;
+ dev->write = block_mmc_write;
+ if (root) {
+ while (*root && (*root)->next)
+ root = &(*root)->next;
+ if (*root)
+ (*root)->next = mmc;
+ else
+ *root = mmc;
+ }
+ return 0;
+}
+
+lba_t block_mmc_read(BlockDev *dev, lba_t start, lba_t count, void *buffer)
{
MmcDevice *mmc = (MmcDevice *)dev->dev_data;
lba_t cur, blocks_todo = count;
@@ -1071,7 +1104,7 @@
return count;
}
-lba_t block_mmc_write(struct BlockDev *dev, lba_t start, lba_t count,
+lba_t block_mmc_write(BlockDev *dev, lba_t start, lba_t count,
const void *buffer)
{
MmcDevice *mmc = (MmcDevice *)dev->dev_data;
diff --git a/src/drivers/storage/mmc.h b/src/drivers/storage/mmc.h
index 3bc239f..70d7133 100644
--- a/src/drivers/storage/mmc.h
+++ b/src/drivers/storage/mmc.h
@@ -260,6 +260,8 @@
char op_cond_pending; /* 1 if we are waiting on an op_cond command */
char init_in_progress; /* 1 if we have done mmc_start_init() */
uint32_t op_cond_response; /* the response byte from the last op_cond */
+ BlockDev *block_dev;
+ struct MmcDevice *next; /* MMC device in same type (for refresh) */
} MmcDevice;
int mmc_busy_wait_io(volatile uint32_t *address, uint32_t *output,
@@ -267,7 +269,6 @@
int mmc_busy_wait_io_until(volatile uint32_t *address, uint32_t *output,
uint32_t io_mask, uint32_t timeout_ms);
-int mmc_register(MmcDevice *mmc);
int mmc_init(MmcDevice *mmc);
int mmc_start_init(MmcDevice *mmc);
int mmc_is_card_present(MmcDevice *mmc);
@@ -277,9 +278,10 @@
uint32_t mmc_write(MmcDevice *mmc, uint32_t start, lba_t block_count,
const void *src);
-lba_t block_mmc_read(struct BlockDev *dev, lba_t start, lba_t count,
- void *buffer);
-lba_t block_mmc_write(struct BlockDev *dev, lba_t start, lba_t count,
+void block_mmc_refresh(ListNode *block_node, MmcDevice *mmc);
+int block_mmc_register(BlockDev *dev, MmcDevice *mmc, MmcDevice **root);
+lba_t block_mmc_read(BlockDev *dev, lba_t start, lba_t count, void *buffer);
+lba_t block_mmc_write(BlockDev *dev, lba_t start, lba_t count,
const void *buffer);
// Helper macros for alignment.
diff --git a/src/drivers/storage/s5p_mshc.c b/src/drivers/storage/s5p_mshc.c
index 3809755..97ded58 100644
--- a/src/drivers/storage/s5p_mshc.c
+++ b/src/drivers/storage/s5p_mshc.c
@@ -55,9 +55,11 @@
{
switch(dev_index) {
case 0:
- return (S5pMshci *)CONFIG_DRIVER_STORAGE_MSHC_S5P_MMC0_ADDRESS;
+ return ((S5pMshci *)
+ CONFIG_DRIVER_STORAGE_MSHC_S5P_MMC0_ADDRESS);
case 1:
- return (S5pMshci *)CONFIG_DRIVER_STORAGE_MSHC_S5P_MMC1_ADDRESS;
+ return ((S5pMshci *)
+ CONFIG_DRIVER_STORAGE_MSHC_S5P_MMC1_ADDRESS);
}
error("Unknown device index (%d): Check your Kconfig settings for "
"DRIVER_MSHC_S5P_DEVICES.\n", dev_index);
@@ -65,6 +67,11 @@
return NULL;
}
+static int s5p_mshci_is_card_present(S5pMshci *reg)
+{
+ return !readl(®->cdetect);
+}
+
static int mshci_setbits(MshciHost *host, unsigned int bits)
{
setbits32(&host->reg->ctrl, bits);
@@ -462,19 +469,16 @@
writel(fifo_val, &host->reg->fifoth);
}
-static int s5p_mshci_is_card_present(MmcDevice *mmc)
+static int mshci_is_card_present(MmcDevice *mmc)
{
- int present = 1; /* for ch0 (eMMC) card is always present */
+ BlockDev *block_dev = (BlockDev *)mmc->block_dev;
MshciHost *host = (MshciHost *)mmc->host;
+ assert(block_dev);
+
debug("%s\n", __func__);
- switch(host->dev_index) {
- case 0: // MMC0 (eMMC) card is always present
- return present;
- case 1: // Also known as PERIPH_ID_SDMMC2
- return !readl(&host->reg->cdetect);
- }
- assert(host->dev_index == 0 || host->dev_index == 1);
- return 0;
+ if (!block_dev->removable)
+ return 1;
+ return s5p_mshci_is_card_present(host->reg);
}
static int mshci_init(MshciHost *host)
@@ -533,9 +537,9 @@
return 0;
}
-static int s5p_mshc_initialize(int dev_index, S5pMshci *reg)
+static int s5p_mshc_initialize(int dev_index, S5pMshci *reg,
+ MmcDevice **refresh_list)
{
- ListNode *root = NULL;
int bus_width = 1;
const int name_size = 16;
char *name;
@@ -558,7 +562,7 @@
mmc_dev->send_cmd = s5p_mshci_send_command;
mmc_dev->set_ios = s5p_mshci_set_ios;
mmc_dev->init = s5p_mshci_init;
- mmc_dev->is_card_present = s5p_mshci_is_card_present;
+ mmc_dev->is_card_present = mshci_is_card_present;
mmc_dev->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
mmc_dev->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_HC;
@@ -566,43 +570,39 @@
mmc_dev->f_max = MAX_MSHCI_CLOCK;
name = malloc(name_size);
- snprintf(name, name_size, "s5p_mshc %d", dev_index);
+ snprintf(name, name_size, "s5p_mshc%d", dev_index);
mshc_dev->name = name;
- mshc_dev->dev_data = mmc_dev;
mshc_dev->block_size = reg->blksiz;
- mshc_dev->read = block_mmc_read;
- mshc_dev->write = block_mmc_write;
/* TODO(hungte) Get configuration data instead of hard-coded. */
if (dev_index == 0) {
bus_width = 8;
mshc_dev->removable = 0;
- root = &fixed_block_devices;
mmc_dev->host_caps |= MMC_MODE_8BIT;
} else {
bus_width = 4;
mshc_dev->removable = 1;
- root = &removable_block_devices;
mmc_dev->host_caps |= MMC_MODE_4BIT;
}
mmc_dev->bus_width = bus_width;
- list_insert_after(&mshc_dev->list_node, root);
- mmc_register(mmc_dev);
- if (mmc_init(mmc_dev))
- error("Failed to reset MMC card #%d.\n", dev_index);
- else
- debug("MMC%d: init success (reset OK).\n", dev_index);
+ if (mshc_dev->removable) {
+ block_mmc_register(mshc_dev, mmc_dev, refresh_list);
+ debug("%s: removable registered (init on refresh).\n", name);
+ } else {
+ block_mmc_register(mshc_dev, mmc_dev, NULL);
+ if (mmc_init(mmc_dev)) {
+ error("%s: failed to init fixed %s.\n", __func__, name);
+ free(name);
+ free(mmc_dev);
+ free(mshc_dev);
+ free(host);
+ return -1;
+ }
+ list_insert_after(&mshc_dev->list_node, &fixed_block_devices);
+ debug("%s: init success (reset OK): %s\n", __func__, name);
+ }
- // Update media size when mmc setup is ready.
- mshc_dev->block_count = mmc_dev->lba;
- mshc_dev->block_size = mmc_dev->read_bl_len;
-
- debug("dev_index=%d, width=%d, reg=%p, removable=%d, "
- "block_size=%d, block_count=%d\n",
- dev_index, bus_width, reg, mshc_dev->removable,
- (int)mshc_dev->block_size,
- (int)mshc_dev->block_count);
return 0;
}
@@ -612,10 +612,22 @@
static void s5p_mshc_ctrlr_init(BlockDevCtrlr *ctrlr)
{
int i;
+ MmcDevice **refresh_list = (MmcDevice **)(&ctrlr->ctrlr_data);
debug("%s started.\n", __func__);
- for (i = 0; i < CONFIG_DRIVER_STORAGE_MSHC_S5P_DEVICES; i++)
- s5p_mshc_initialize(i, s5p_get_base_mshci(i));
+ for (i = 0; i < CONFIG_DRIVER_STORAGE_MSHC_S5P_DEVICES; i++) {
+ s5p_mshc_initialize(i, s5p_get_base_mshci(i), refresh_list);
+ }
+}
+
+static void s5p_mshc_ctrlr_refresh(BlockDevCtrlr *ctrlr)
+{
+ MmcDevice *mmc = (MmcDevice *)ctrlr->ctrlr_data;
+ debug("%s: enter (root=%p).\n", __func__, mmc);
+ for (; mmc; mmc = mmc->next) {
+ block_mmc_refresh(&removable_block_devices, mmc);
+ }
+ debug("%s: leave.\n", __func__);
}
int s5p_mshc_ctrlr_register(void)
@@ -623,7 +635,8 @@
static BlockDevCtrlr s5p_mshc =
{
&s5p_mshc_ctrlr_init,
- // TODO(hungte) Add refresh function.
+ &s5p_mshc_ctrlr_refresh,
+ NULL,
};
list_insert_after(&s5p_mshc.list_node, &block_dev_controllers);
debug("%s: done.\n", __func__);
diff --git a/src/vboot/Makefile.inc b/src/vboot/Makefile.inc
index 1623430..fd42b51 100644
--- a/src/vboot/Makefile.inc
+++ b/src/vboot/Makefile.inc
@@ -63,6 +63,7 @@
else
@printf " MAKE $(subst $(obj)/,,$(@))\n"
$(Q)FIRMWARE_ARCH=$(VB_FIRMWARE_ARCH) \
+ CC="$(XCC)" \
CFLAGS="$(CFLAGS) -DVBOOT_DEBUG" \
make -C $(VB_SOURCE) \
MOCK_TPM=$(VBOOT_MOCK_TPM) \