summaryrefslogtreecommitdiff
path: root/chip
diff options
context:
space:
mode:
Diffstat (limited to 'chip')
-rw-r--r--chip/g/board_id.c17
-rw-r--r--chip/g/flash.c66
-rw-r--r--chip/g/flash_info.h3
-rw-r--r--chip/g/sn_bits.c15
-rw-r--r--chip/g/system.c18
5 files changed, 16 insertions, 103 deletions
diff --git a/chip/g/board_id.c b/chip/g/board_id.c
index 1f46bd8226..c863a81fba 100644
--- a/chip/g/board_id.c
+++ b/chip/g/board_id.c
@@ -74,14 +74,6 @@ int read_board_id(struct board_id *id)
id_p = (uint32_t *)id;
- /* Make sure INFO1 board ID space is readable */
- if (flash_info_read_enable(INFO_BOARD_ID_OFFSET,
- INFO_BOARD_ID_PROTECT_SIZE) !=
- EC_SUCCESS) {
- CPRINTS("%s: failed to enable read access to info", __func__);
- return EC_ERROR_ACCESS_DENIED;
- }
-
for (i = 0; i < sizeof(*id); i += sizeof(uint32_t)) {
int rv;
@@ -156,13 +148,7 @@ static int write_board_id(const struct board_id *id, int clear_flags)
return EC_ERROR_ACCESS_DENIED;
}
- /* Enable write access */
- if (flash_info_write_enable(INFO_BOARD_ID_OFFSET,
- INFO_BOARD_ID_PROTECT_SIZE) !=
- EC_SUCCESS) {
- CPRINTS("%s: failed to enable write access", __func__);
- return EC_ERROR_ACCESS_DENIED;
- }
+ flash_info_write_enable();
/* Write Board ID */
rv = flash_info_physical_write(INFO_BOARD_ID_OFFSET +
@@ -171,7 +157,6 @@ static int write_board_id(const struct board_id *id, int clear_flags)
if (rv != EC_SUCCESS)
CPRINTS("%s: write failed", __func__);
- /* Disable write access */
flash_info_write_disable();
return rv;
diff --git a/chip/g/flash.c b/chip/g/flash.c
index 07573f7fd9..443ab23efe 100644
--- a/chip/g/flash.c
+++ b/chip/g/flash.c
@@ -103,6 +103,13 @@ int flash_pre_init(void)
GWRITE_FIELD(GLOBALSEC, FLASH_REGION5_CTRL, RD_EN, 1);
flash_log_register_flash_control_callback(flash_log_space_control);
#endif
+
+ /* Create a flash region window for INFO1 access. */
+ GREG32(GLOBALSEC, FLASH_REGION7_BASE_ADDR) = FLASH_INFO_MEMORY_BASE;
+ GREG32(GLOBALSEC, FLASH_REGION7_SIZE) = FLASH_INFO_SIZE - 1;
+ GWRITE_FIELD(GLOBALSEC, FLASH_REGION7_CTRL, EN, 1);
+ GWRITE_FIELD(GLOBALSEC, FLASH_REGION7_CTRL, RD_EN, 1);
+
return EC_SUCCESS;
}
@@ -388,62 +395,14 @@ int flash_physical_info_read_word(int byte_offset, uint32_t *dst)
return ret;
}
-/*
- * Verify that the range's size is power of 2, the range offset is aligned by
- * size, and the range does not cross the INFO space boundary.
- */
-static int valid_info_range(uint32_t offset, size_t size)
+void flash_info_write_enable(void)
{
- if (!size || (size & (size - 1)))
- return 0;
-
- if (offset & (size - 1))
- return 0;
-
- if ((offset + size) > FLASH_INFO_SIZE)
- return 0;
-
- return 1;
-
-}
-
-/* Write access is a superset of read access. */
-static int flash_info_configure_access(uint32_t offset,
- size_t size, int write_mode)
-{
- int mask;
-
- if (!valid_info_range(offset, size))
- return EC_ERROR_INVAL;
-
- mask = GREG32(GLOBALSEC, FLASH_REGION6_CTRL);
- mask |= GC_GLOBALSEC_FLASH_REGION6_CTRL_EN_MASK |
- GC_GLOBALSEC_FLASH_REGION6_CTRL_RD_EN_MASK;
- if (write_mode)
- mask |= GC_GLOBALSEC_FLASH_REGION6_CTRL_WR_EN_MASK;
-
- GREG32(GLOBALSEC, FLASH_REGION6_BASE_ADDR) =
- FLASH_INFO_MEMORY_BASE + offset;
-
- GREG32(GLOBALSEC, FLASH_REGION6_SIZE) = size - 1;
- GREG32(GLOBALSEC, FLASH_REGION6_CTRL) = mask;
-
- return EC_SUCCESS;
-}
-
-int flash_info_read_enable(uint32_t offset, size_t size)
-{
- return flash_info_configure_access(offset, size, 0);
-}
-
-int flash_info_write_enable(uint32_t offset, size_t size)
-{
- return flash_info_configure_access(offset, size, 1);
+ GWRITE_FIELD(GLOBALSEC, FLASH_REGION7_CTRL, WR_EN, 1);
}
void flash_info_write_disable(void)
{
- GWRITE_FIELD(GLOBALSEC, FLASH_REGION6_CTRL, WR_EN, 0);
+ GWRITE_FIELD(GLOBALSEC, FLASH_REGION7_CTRL, WR_EN, 0);
}
int flash_info_physical_write(int byte_offset, int num_bytes, const char *data)
@@ -516,9 +475,6 @@ static int command_erase_flash_info(int argc, char **argv)
return rv;
}
- flash_info_read_enable(0, 2048);
- flash_info_write_enable(0, 2048);
-
/* Read the entire info1. */
p = (uint32_t *)info1;
for (i = 0; i < (sizeof(*info1) / sizeof(*p)); i++) {
@@ -577,6 +533,8 @@ static int command_erase_flash_info(int argc, char **argv)
mutex_lock(&flash_mtx);
+ flash_info_write_enable();
+
rv = do_flash_op(OP_ERASE_BLOCK, 1, 0, 512);
mutex_unlock(&flash_mtx);
diff --git a/chip/g/flash_info.h b/chip/g/flash_info.h
index e07fac1ed7..464eb70dbd 100644
--- a/chip/g/flash_info.h
+++ b/chip/g/flash_info.h
@@ -30,9 +30,8 @@
#define INFO_BOARD_SPACE_OFFSET (INFO_RW_MAP_OFFSET + INFO_RW_MAP_SIZE)
-int flash_info_read_enable(uint32_t offset, size_t size);
/* This in fact enables both read and write. */
-int flash_info_write_enable(uint32_t offset, size_t size);
+void flash_info_write_enable(void);
void flash_info_write_disable(void);
int flash_info_physical_write(int byte_offset, int num_bytes, const char *data);
int flash_physical_info_read_word(int byte_offset, uint32_t *dst);
diff --git a/chip/g/sn_bits.c b/chip/g/sn_bits.c
index 0057d26299..23fb6ada7f 100644
--- a/chip/g/sn_bits.c
+++ b/chip/g/sn_bits.c
@@ -26,14 +26,6 @@ int read_sn_data(struct sn_data *sn)
id_p = (uint32_t *)sn;
- /* Make sure INFO1 sn bits space is readable */
- if (flash_info_read_enable(INFO_SN_DATA_OFFSET,
- INFO_SN_DATA_PROTECT_SIZE) !=
- EC_SUCCESS) {
- CPRINTS("%s: failed to enable read access to info", __func__);
- return EC_ERROR_ACCESS_DENIED;
- }
-
for (i = 0; i < sizeof(*sn); i += sizeof(uint32_t)) {
int rv;
@@ -54,12 +46,7 @@ static int write_sn_data(struct sn_data *sn_data, int header_only)
int rv = EC_SUCCESS;
/* Enable write access */
- if (flash_info_write_enable(INFO_SN_DATA_OFFSET,
- INFO_SN_DATA_PROTECT_SIZE) !=
- EC_SUCCESS) {
- CPRINTS("%s: failed to enable write access", __func__);
- return EC_ERROR_ACCESS_DENIED;
- }
+ flash_info_write_enable();
/* Write sn bits */
rv = flash_info_physical_write(INFO_SN_DATA_OFFSET,
diff --git a/chip/g/system.c b/chip/g/system.c
index f28e0a5c5d..d15ec42ebe 100644
--- a/chip/g/system.c
+++ b/chip/g/system.c
@@ -614,15 +614,6 @@ static void update_rollback_mask(const struct SignedHeader *header_a,
uint32_t header_mask = 0;
/*
- * Make sure INFO1 RW map space is readable.
- */
- if (flash_info_read_enable(INFO_RW_MAP_OFFSET, INFO_RW_MAP_SIZE) !=
- EC_SUCCESS) {
- CPRINTS("%s: failed to enable read access to info", __func__);
- return;
- }
-
- /*
* The infomap field in the image header has a matching space in the
* flash INFO1 section.
*
@@ -680,13 +671,7 @@ static void update_rollback_mask(const struct SignedHeader *header_a,
continue; /* This word has been zeroed already. */
if (!write_enabled) {
- if (flash_info_write_enable(
- INFO_RW_MAP_OFFSET,
- INFO_RW_MAP_SIZE) != EC_SUCCESS) {
- CPRINTS("%s: failed to enable write access to"
- " info", __func__);
- return;
- }
+ flash_info_write_enable();
write_enabled = 1;
}
@@ -739,7 +724,6 @@ void system_get_rollback_bits(char *value, size_t value_size)
get_program_memory_addr(SYSTEM_IMAGE_RW_B)},
};
- flash_info_read_enable(INFO_RW_MAP_OFFSET, INFO_RW_MAP_SIZE);
for (i = 0; i < INFO_MAX; i++) {
uint32_t w;