xref: /rk3399_rockchip-uboot/include/blk.h (revision 2a981dc2c62c500110aad297fa70503aec36e689)
11a73661bSSimon Glass /*
21a73661bSSimon Glass  * (C) Copyright 2000-2004
31a73661bSSimon Glass  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
41a73661bSSimon Glass  *
51a73661bSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
61a73661bSSimon Glass  */
71a73661bSSimon Glass 
81a73661bSSimon Glass #ifndef BLK_H
91a73661bSSimon Glass #define BLK_H
101a73661bSSimon Glass 
111a73661bSSimon Glass #ifdef CONFIG_SYS_64BIT_LBA
121a73661bSSimon Glass typedef uint64_t lbaint_t;
131a73661bSSimon Glass #define LBAFlength "ll"
141a73661bSSimon Glass #else
151a73661bSSimon Glass typedef ulong lbaint_t;
161a73661bSSimon Glass #define LBAFlength "l"
171a73661bSSimon Glass #endif
181a73661bSSimon Glass #define LBAF "%" LBAFlength "x"
191a73661bSSimon Glass #define LBAFU "%" LBAFlength "u"
201a73661bSSimon Glass 
211a73661bSSimon Glass /* Interface types: */
225ec4f1a5SSimon Glass enum if_type {
235ec4f1a5SSimon Glass 	IF_TYPE_UNKNOWN = 0,
245ec4f1a5SSimon Glass 	IF_TYPE_IDE,
255ec4f1a5SSimon Glass 	IF_TYPE_SCSI,
265ec4f1a5SSimon Glass 	IF_TYPE_ATAPI,
275ec4f1a5SSimon Glass 	IF_TYPE_USB,
285ec4f1a5SSimon Glass 	IF_TYPE_DOC,
295ec4f1a5SSimon Glass 	IF_TYPE_MMC,
305ec4f1a5SSimon Glass 	IF_TYPE_SD,
315ec4f1a5SSimon Glass 	IF_TYPE_SATA,
325ec4f1a5SSimon Glass 	IF_TYPE_HOST,
335ec4f1a5SSimon Glass 
345ec4f1a5SSimon Glass 	IF_TYPE_COUNT,			/* Number of interface types */
355ec4f1a5SSimon Glass };
361a73661bSSimon Glass 
371a73661bSSimon Glass struct blk_desc {
385ec4f1a5SSimon Glass 	enum if_type	if_type;	/* type of the interface */
39bcce53d0SSimon Glass 	int		devnum;		/* device number */
401a73661bSSimon Glass 	unsigned char	part_type;	/* partition type */
411a73661bSSimon Glass 	unsigned char	target;		/* target SCSI ID */
421a73661bSSimon Glass 	unsigned char	lun;		/* target LUN */
431a73661bSSimon Glass 	unsigned char	hwpart;		/* HW partition, e.g. for eMMC */
441a73661bSSimon Glass 	unsigned char	type;		/* device type */
451a73661bSSimon Glass 	unsigned char	removable;	/* removable device */
461a73661bSSimon Glass #ifdef CONFIG_LBA48
471a73661bSSimon Glass 	/* device can use 48bit addr (ATA/ATAPI v7) */
481a73661bSSimon Glass 	unsigned char	lba48;
491a73661bSSimon Glass #endif
501a73661bSSimon Glass 	lbaint_t	lba;		/* number of blocks */
511a73661bSSimon Glass 	unsigned long	blksz;		/* block size */
521a73661bSSimon Glass 	int		log2blksz;	/* for convenience: log2(blksz) */
531a73661bSSimon Glass 	char		vendor[40+1];	/* IDE model, SCSI Vendor */
541a73661bSSimon Glass 	char		product[20+1];	/* IDE Serial no, SCSI product */
551a73661bSSimon Glass 	char		revision[8+1];	/* firmware revision */
561a73661bSSimon Glass 	unsigned long	(*block_read)(struct blk_desc *block_dev,
571a73661bSSimon Glass 				      lbaint_t start,
581a73661bSSimon Glass 				      lbaint_t blkcnt,
591a73661bSSimon Glass 				      void *buffer);
601a73661bSSimon Glass 	unsigned long	(*block_write)(struct blk_desc *block_dev,
611a73661bSSimon Glass 				       lbaint_t start,
621a73661bSSimon Glass 				       lbaint_t blkcnt,
631a73661bSSimon Glass 				       const void *buffer);
641a73661bSSimon Glass 	unsigned long	(*block_erase)(struct blk_desc *block_dev,
651a73661bSSimon Glass 				       lbaint_t start,
661a73661bSSimon Glass 				       lbaint_t blkcnt);
671a73661bSSimon Glass 	void		*priv;		/* driver private struct pointer */
681a73661bSSimon Glass };
691a73661bSSimon Glass 
701a73661bSSimon Glass #define BLOCK_CNT(size, blk_desc) (PAD_COUNT(size, blk_desc->blksz))
711a73661bSSimon Glass #define PAD_TO_BLOCKSIZE(size, blk_desc) \
721a73661bSSimon Glass 	(PAD_SIZE(size, blk_desc->blksz))
731a73661bSSimon Glass 
74*2a981dc2SSimon Glass /*
75*2a981dc2SSimon Glass  * These functions should take struct udevice instead of struct blk_desc,
76*2a981dc2SSimon Glass  * but this is convenient for migration to driver model. Add a 'd' prefix
77*2a981dc2SSimon Glass  * to the function operations, so that blk_read(), etc. can be reserved for
78*2a981dc2SSimon Glass  * functions with the correct arguments.
79*2a981dc2SSimon Glass  */
80*2a981dc2SSimon Glass static inline ulong blk_dread(struct blk_desc *block_dev, lbaint_t start,
81*2a981dc2SSimon Glass 			      lbaint_t blkcnt, void *buffer)
82*2a981dc2SSimon Glass {
83*2a981dc2SSimon Glass 	/*
84*2a981dc2SSimon Glass 	 * We could check if block_read is NULL and return -ENOSYS. But this
85*2a981dc2SSimon Glass 	 * bloats the code slightly (cause some board to fail to build), and
86*2a981dc2SSimon Glass 	 * it would be an error to try an operation that does not exist.
87*2a981dc2SSimon Glass 	 */
88*2a981dc2SSimon Glass 	return block_dev->block_read(block_dev, start, blkcnt, buffer);
89*2a981dc2SSimon Glass }
90*2a981dc2SSimon Glass 
91*2a981dc2SSimon Glass static inline ulong blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
92*2a981dc2SSimon Glass 			       lbaint_t blkcnt, const void *buffer)
93*2a981dc2SSimon Glass {
94*2a981dc2SSimon Glass 	return block_dev->block_write(block_dev, start, blkcnt, buffer);
95*2a981dc2SSimon Glass }
96*2a981dc2SSimon Glass 
97*2a981dc2SSimon Glass static inline ulong blk_derase(struct blk_desc *block_dev, lbaint_t start,
98*2a981dc2SSimon Glass 			       lbaint_t blkcnt)
99*2a981dc2SSimon Glass {
100*2a981dc2SSimon Glass 	return block_dev->block_erase(block_dev, start, blkcnt);
101*2a981dc2SSimon Glass }
102*2a981dc2SSimon Glass 
1031a73661bSSimon Glass #endif
104