diff options
author | Deepak Kodihalli <dkodihal@in.ibm.com> | 2017-07-13 12:04:06 -0500 |
---|---|---|
committer | Deepak Kodihalli <dkodihal@in.ibm.com> | 2017-07-18 22:54:23 -0500 |
commit | abd52a78941e91bb603772a252c3a98477fec44d (patch) | |
tree | 704e1406c8d3718db33259b2af1b17d3c94d85e1 /mboxd_flash.c | |
parent | 96acf160aec88fb754606baa361b4407de066724 (diff) | |
download | phosphor-mboxd-abd52a78941e91bb603772a252c3a98477fec44d.tar.gz phosphor-mboxd-abd52a78941e91bb603772a252c3a98477fec44d.zip |
vpnor: implement init_flash_dev
The vpnor version needs to set the erase block size as 4K.
That's the size hostboot expects in the FFS structure.
This change also requires moving code from mboxd_flash.c to
mboxd_flash_physical.c, else there will be 3 symbols per flash function.
It should suffice to just have mboxd_flash_physical.c and
mboxd_flash_virtual.cpp.
Change-Id: I35442a0c1dbee7f66b278cbf094be78e870b6c86
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Diffstat (limited to 'mboxd_flash.c')
-rw-r--r-- | mboxd_flash.c | 232 |
1 files changed, 0 insertions, 232 deletions
diff --git a/mboxd_flash.c b/mboxd_flash.c deleted file mode 100644 index 4b6c1f7..0000000 --- a/mboxd_flash.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Mailbox Daemon Flash Helpers - * - * Copyright 2016 IBM - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#define _GNU_SOURCE -#include <assert.h> -#include <errno.h> -#include <fcntl.h> -#include <getopt.h> -#include <limits.h> -#include <poll.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> -#include <signal.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/timerfd.h> -#include <sys/types.h> -#include <time.h> -#include <unistd.h> -#include <inttypes.h> -#include <mtd/mtd-abi.h> - -#include "mbox.h" -#include "common.h" -#include "mboxd_flash.h" - -int init_flash_dev(struct mbox_context *context) -{ - char *filename = get_dev_mtd(); - int fd, rc = 0; - - if (!filename) { - MSG_ERR("Couldn't find the PNOR /dev/mtd partition\n"); - return -1; - } - - MSG_DBG("Opening %s\n", filename); - - /* Open Flash Device */ - fd = open(filename, O_RDWR); - if (fd < 0) { - MSG_ERR("Couldn't open %s with flags O_RDWR: %s\n", - filename, strerror(errno)); - rc = -errno; - goto out; - } - context->fds[MTD_FD].fd = fd; - - /* Read the Flash Info */ - if (ioctl(fd, MEMGETINFO, &context->mtd_info) == -1) { - MSG_ERR("Couldn't get information about MTD: %s\n", - strerror(errno)); - rc = -1; - goto out; - } - - if (context->flash_size == 0) { - /* - * PNOR images for current OpenPOWER systems are at most 64MB - * despite the PNOR itself sometimes being as big as 128MB. To - * ensure the image read from the PNOR is exposed in the LPC - * address space at the location expected by the host firmware, - * it is required that the image size be used for - * context->flash_size, and not the size of the flash device. - * - * However, the test cases specify the flash size via special - * test APIs (controlling flash behaviour) which don't have - * access to the mbox context. Rather than requiring - * error-prone assignments in every test case, we instead rely - * on context->flash_size being set to the size reported by the - * MEMINFO ioctl(). - * - * As this case should never be hit in production (i.e. outside - * the test environment), log an error. As a consequence, this - * error is expected in the test case output. - */ - MSG_ERR("Flash size MUST be supplied on the commandline. However, continuing by assuming flash is %u bytes\n", - context->mtd_info.size); - context->flash_size = context->mtd_info.size; - } - - /* We know the erase size so we can allocate the flash_erased bytemap */ - context->erase_size_shift = log_2(context->mtd_info.erasesize); - context->flash_bmap = calloc(context->flash_size >> - context->erase_size_shift, - sizeof(*context->flash_bmap)); - MSG_DBG("Flash erase size: 0x%.8x\n", context->mtd_info.erasesize); - -out: - free(filename); - return rc; -} - -void free_flash_dev(struct mbox_context *context) -{ - free(context->flash_bmap); - close(context->fds[MTD_FD].fd); -} - -/* Flash Functions */ - -/* - * flash_is_erased() - Check if an offset into flash is erased - * @context: The mbox context pointer - * @offset: The flash offset to check (bytes) - * - * Return: true if erased otherwise false - */ -static inline bool flash_is_erased(struct mbox_context *context, - uint32_t offset) -{ - return context->flash_bmap[offset >> context->erase_size_shift] - == FLASH_ERASED; -} - -/* - * set_flash_bytemap() - Set the flash erased bytemap - * @context: The mbox context pointer - * @offset: The flash offset to set (bytes) - * @count: Number of bytes to set - * @val: Value to set the bytemap to - * - * The flash bytemap only tracks the erased status at the erase block level so - * this will update the erased state for an (or many) erase blocks - * - * Return: 0 if success otherwise negative error code - */ -int set_flash_bytemap(struct mbox_context *context, uint32_t offset, - uint32_t count, uint8_t val) -{ - if ((offset + count) > context->flash_size) { - return -MBOX_R_PARAM_ERROR; - } - - MSG_DBG("Set flash bytemap @ 0x%.8x for 0x%.8x to %s\n", - offset, count, val ? "ERASED" : "DIRTY"); - memset(context->flash_bmap + (offset >> context->erase_size_shift), - val, - align_up(count, 1 << context->erase_size_shift) >> - context->erase_size_shift); - - return 0; -} - -/* - * erase_flash() - Erase the flash - * @context: The mbox context pointer - * @offset: The flash offset to erase (bytes) - * @size: The number of bytes to erase - * - * Return: 0 on success otherwise negative error code - */ -int erase_flash(struct mbox_context *context, uint32_t offset, uint32_t count) -{ - const uint32_t erase_size = 1 << context->erase_size_shift; - struct erase_info_user erase_info = { 0 }; - int rc; - - MSG_DBG("Erase flash @ 0x%.8x for 0x%.8x\n", offset, count); - - /* - * We have an erased_bytemap for the flash so we want to avoid erasing - * blocks which we already know to be erased. Look for runs of blocks - * which aren't erased and erase the entire run at once to avoid how - * often we have to call the erase ioctl. If the block is already - * erased then there's nothing we need to do. - */ - while (count) { - if (!flash_is_erased(context, offset)) { /* Need to erase */ - if (!erase_info.length) { /* Start of not-erased run */ - erase_info.start = offset; - } - erase_info.length += erase_size; - } else if (erase_info.length) { /* Already erased|end of run? */ - /* Erase the previous run which just ended */ - MSG_DBG("Erase flash @ 0x%.8x for 0x%.8x\n", - erase_info.start, erase_info.length); - rc = ioctl(context->fds[MTD_FD].fd, MEMERASE, - &erase_info); - if (rc < 0) { - MSG_ERR("Couldn't erase flash at 0x%.8x\n", - erase_info.start); - return -MBOX_R_SYSTEM_ERROR; - } - /* Mark ERASED where we just erased */ - set_flash_bytemap(context, erase_info.start, - erase_info.length, FLASH_ERASED); - erase_info.start = 0; - erase_info.length = 0; - } - - offset += erase_size; - count -= erase_size; - } - - if (erase_info.length) { - MSG_DBG("Erase flash @ 0x%.8x for 0x%.8x\n", - erase_info.start, erase_info.length); - rc = ioctl(context->fds[MTD_FD].fd, MEMERASE, &erase_info); - if (rc < 0) { - MSG_ERR("Couldn't erase flash at 0x%.8x\n", - erase_info.start); - return -MBOX_R_SYSTEM_ERROR; - } - /* Mark ERASED where we just erased */ - set_flash_bytemap(context, erase_info.start, erase_info.length, - FLASH_ERASED); - } - - return 0; -} |