/ payloads / libpayload / include / storage / storage.h
storage.h
 1  /*
 2   *
 3   * Copyright (C) 2012 secunet Security Networks AG
 4   *
 5   * Redistribution and use in source and binary forms, with or without
 6   * modification, are permitted provided that the following conditions
 7   * are met:
 8   * 1. Redistributions of source code must retain the above copyright
 9   *    notice, this list of conditions and the following disclaimer.
10   * 2. Redistributions in binary form must reproduce the above copyright
11   *    notice, this list of conditions and the following disclaimer in the
12   *    documentation and/or other materials provided with the distribution.
13   * 3. The name of the author may not be used to endorse or promote products
14   *    derived from this software without specific prior written permission.
15   *
16   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26   * SUCH DAMAGE.
27   */
28  
29  #ifndef _STORAGE_STORAGE_H
30  #define _STORAGE_STORAGE_H
31  
32  #include <stdint.h>
33  #include <unistd.h>
34  
35  #if !CONFIG(LP_STORAGE_64BIT_LBA)
36  typedef u32 lba_t;
37  #else
38  typedef u64 lba_t;
39  #endif
40  
41  typedef enum {
42  	PORT_TYPE_IDE	= (1 << 0),
43  	PORT_TYPE_SATA	= (1 << 1),
44  	PORT_TYPE_USB	= (1 << 2),
45  	PORT_TYPE_NVME	= (1 << 3),
46  } storage_port_t;
47  
48  typedef enum {
49  	POLL_MEDIUM_ERROR	= -3,
50  	POLL_NO_DEVICE		= -2,
51  	POLL_ERROR		= -1,
52  	POLL_NO_MEDIUM		=  0,
53  	POLL_MEDIUM_PRESENT	=  1,
54  } storage_poll_t;
55  
56  struct storage_dev;
57  
58  typedef struct storage_dev {
59  	storage_port_t port_type;
60  
61  	storage_poll_t (*poll)(struct storage_dev *);
62  	ssize_t (*read_blocks512)(struct storage_dev *, lba_t start, size_t count, unsigned char *buf);
63  	ssize_t (*write_blocks512)(struct storage_dev *, lba_t start, size_t count, const unsigned char *buf);
64  
65  	void (*detach_device)(struct storage_dev *);
66  } storage_dev_t;
67  
68  int storage_device_count(void);
69  int storage_attach_device(storage_dev_t *dev);
70  
71  storage_poll_t storage_probe(size_t dev_num);
72  ssize_t storage_read_blocks512(size_t dev_num, lba_t start, size_t count, unsigned char *buf);
73  
74  #endif