1/* $NetBSD: flash.h,v 1.9 2018/04/19 21:50:08 christos Exp $ */ 2 3/*- 4 * Copyright (c) 2011 Department of Software Engineering, 5 * University of Szeged, Hungary 6 * Copyright (c) 2011 Adam Hoka <ahoka@NetBSD.org> 7 * Copyright (c) 2010 David Tengeri <dtengeri@inf.u-szeged.hu> 8 * All rights reserved. 9 * 10 * This code is derived from software contributed to The NetBSD Foundation 11 * by the Department of Software Engineering, University of Szeged, Hungary 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35#ifndef _FLASH_H_ 36#define _FLASH_H_ 37 38#include <sys/param.h> 39#include <sys/device.h> 40#include <sys/module.h> 41#include <sys/buf.h> 42#include <sys/flashio.h> 43 44#ifdef FLASH_DEBUG 45#define FLDPRINTF(x) if (flashdebug) printf x 46#define FLDPRINTFN(n,x) if (flashdebug>(n)) printf x 47#else 48#define FLDPRINTF(x) 49#define FLDPRINTFN(n,x) 50#endif 51 52struct flash_partition { 53 flash_off_t part_offset; 54 flash_size_t part_size; 55 int part_flags; 56 const char *part_name; 57}; 58 59/** 60 * flash_softc - private structure for flash layer driver 61 */ 62 63struct flash_softc { 64 device_t sc_dev; 65 device_t sc_parent_dev; /* Hardware (parent) device */ 66 void *hw_softc; /* Hardware device private softc */ 67 struct flash_interface *flash_if; /* Hardware interface */ 68 struct flash_partition sc_partinfo; /* partition information */ 69 70 bool sc_readonly; /* read only flash device */ 71}; 72 73struct flash_attach_args { 74 struct flash_interface *flash_if; /* Hardware interface */ 75 struct flash_partition partinfo; 76}; 77 78/** 79 * struct erase_instruction - instructions to erase a flash eraseblock 80 */ 81struct flash_erase_instruction { 82 flash_off_t ei_addr; 83 flash_off_t ei_len; 84 void (*ei_callback)(struct flash_erase_instruction *); 85 u_long ei_priv; 86 u_char ei_state; 87}; 88 89enum { 90 FLASH_PART_READONLY = (1<<0), 91 FLASH_PART_FILESYSTEM = (1<<2) 92}; 93 94/** 95 * struct flash_interface - interface for flash operations 96 */ 97struct flash_interface { 98 int (*erase)(device_t, struct flash_erase_instruction *); 99 int (*read)(device_t, flash_off_t, size_t, size_t *, uint8_t *); 100 int (*write)(device_t, flash_off_t, size_t, size_t *, const uint8_t *); 101 int (*block_markbad)(device_t, flash_off_t); 102 int (*block_isbad)(device_t, flash_off_t, bool *); 103 int (*sync)(device_t); 104 105 int (*submit)(device_t, struct buf *); 106 107 uint32_t page_size; 108 uint32_t erasesize; 109 uint32_t writesize; 110 uint32_t minor; 111 uint8_t type; 112}; 113 114/** 115 * struct cache - for caching writes on block device 116 */ 117struct flash_cache { 118 size_t fc_len; 119 flash_off_t fc_block; 120 uint8_t *fc_data; 121}; 122 123device_t flash_attach_mi(struct flash_interface *, device_t); 124void flash_attach_mtdparts(struct flash_interface *, device_t, flash_size_t, const char *, const char *); 125const struct flash_interface *flash_get_interface(dev_t); 126const struct flash_softc *flash_get_softc(dev_t); 127device_t flash_get_device(dev_t); 128flash_size_t flash_get_size(dev_t); 129 130/* flash operations should be used through these */ 131int flash_erase(device_t, struct flash_erase_instruction *); 132int flash_read(device_t, flash_off_t, size_t, size_t *, uint8_t *); 133int flash_write(device_t, flash_off_t, size_t, size_t *, const uint8_t *); 134int flash_block_markbad(device_t, flash_off_t); 135int flash_block_isbad(device_t, flash_off_t, bool *); 136int flash_sync(device_t); 137 138/* 139 * check_pattern - checks the buffer only contains the byte pattern 140 * 141 * This functions checks if the buffer only contains a specified byte pattern. 142 * Returns %0 if found something else, %1 otherwise. 143 */ 144static __inline int 145check_pattern(const void *buf, uint8_t patt, size_t offset, size_t size) 146{ 147 size_t i; 148 for (i = offset; i < size; i++) { 149 if (((const uint8_t *)buf)[i] != patt) 150 return 0; 151 } 152 return 1; 153} 154 155#endif /* _FLASH_H_ */ 156