mirror of
https://github.com/Dasharo/skiboot.git
synced 2026-03-06 14:50:44 -08:00
49496485fe
SPDX makes it a simpler diff. I have audited the commit history of each file to ensure that they are exclusively authored by IBM and thus we have the right to relicense. The motivation behind this is twofold: 1) We want to enable experiments with coreboot, which is GPLv2 licensed 2) An upcoming firmware component wants to incorporate code from skiboot and code from the Linux kernel, which is GPLv2 licensed. I have gone through the IBM internal way of gaining approval for this. The following files are not exclusively authored by IBM, so are *not* included in this update (I will be seeking approval from contributors): core/direct-controls.c core/flash.c core/pcie-slot.c external/common/arch_flash_unknown.c external/common/rules.mk external/gard/Makefile external/gard/rules.mk external/opal-prd/Makefile external/pflash/Makefile external/xscom-utils/Makefile hdata/vpd.c hw/dts.c hw/ipmi/ipmi-watchdog.c hw/phb4.c include/cpu.h include/phb4.h include/platform.h libflash/libffs.c libstb/mbedtls/sha512.c libstb/mbedtls/sha512.h platforms/astbmc/barreleye.c platforms/astbmc/garrison.c platforms/astbmc/mihawk.c platforms/astbmc/nicole.c platforms/astbmc/p8dnu.c platforms/astbmc/p8dtu.c platforms/astbmc/p9dsu.c platforms/astbmc/vesnin.c platforms/rhesus/ec/config.h platforms/rhesus/ec/gpio.h platforms/rhesus/gpio.c platforms/rhesus/rhesus.c platforms/astbmc/talos.c platforms/astbmc/romulus.c Signed-off-by: Stewart Smith <stewart@linux.ibm.com> [oliver: fixed up the drift] Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
79 lines
2.8 KiB
C
79 lines
2.8 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/* Copyright 2013-2017 IBM Corp. */
|
|
|
|
#ifndef __LIBFLASH_BLOCKLEVEL_H
|
|
#define __LIBFLASH_BLOCKLEVEL_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
struct bl_prot_range {
|
|
uint64_t start;
|
|
uint64_t len;
|
|
};
|
|
|
|
struct blocklevel_range {
|
|
struct bl_prot_range *prot;
|
|
int n_prot;
|
|
int total_prot;
|
|
};
|
|
|
|
enum blocklevel_flags {
|
|
WRITE_NEED_ERASE = 1,
|
|
};
|
|
|
|
/*
|
|
* libffs may be used with different backends, all should provide these for
|
|
* libflash to get the information it needs
|
|
*/
|
|
struct blocklevel_device {
|
|
void *priv;
|
|
int (*reacquire)(struct blocklevel_device *bl);
|
|
int (*release)(struct blocklevel_device *bl);
|
|
int (*read)(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len);
|
|
int (*write)(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len);
|
|
int (*erase)(struct blocklevel_device *bl, uint64_t pos, uint64_t len);
|
|
int (*get_info)(struct blocklevel_device *bl, const char **name, uint64_t *total_size,
|
|
uint32_t *erase_granule);
|
|
bool (*exit)(struct blocklevel_device *bl);
|
|
|
|
/*
|
|
* Keep the erase mask so that blocklevel_erase() can do sanity checking
|
|
*/
|
|
uint32_t erase_mask;
|
|
bool keep_alive;
|
|
enum blocklevel_flags flags;
|
|
|
|
struct blocklevel_range ecc_prot;
|
|
};
|
|
int blocklevel_raw_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len);
|
|
int blocklevel_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len);
|
|
int blocklevel_raw_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len);
|
|
int blocklevel_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len);
|
|
int blocklevel_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len);
|
|
int blocklevel_get_info(struct blocklevel_device *bl, const char **name, uint64_t *total_size,
|
|
uint32_t *erase_granule);
|
|
|
|
/*
|
|
* blocklevel_smart_write() performs reads on the data to see if it
|
|
* can skip erase or write calls. This is likely more convenient for
|
|
* the caller since they don't need to perform these checks
|
|
* themselves. Depending on the new and old data, this may be faster
|
|
* or slower than the just using blocklevel_erase/write calls.
|
|
* directly.
|
|
*/
|
|
int blocklevel_smart_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len);
|
|
|
|
/*
|
|
* blocklevel_smart_erase() will handle unaligned erases.
|
|
* blocklevel_erase() expects a erase_granule aligned buffer and the
|
|
* erase length to be an exact multiple of erase_granule,
|
|
* blocklevel_smart_erase() solves this requirement by performing a
|
|
* read erase write under the hood.
|
|
*/
|
|
int blocklevel_smart_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len);
|
|
/* Implemented in software at this level */
|
|
int blocklevel_ecc_protect(struct blocklevel_device *bl, uint32_t start, uint32_t len);
|
|
|
|
#endif /* __LIBFLASH_BLOCKLEVEL_H */
|