]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/block/blk_legacy.c
2 * Copyright (C) 2016 Google, Inc
3 * Written by Simon Glass <sjg@chromium.org>
5 * SPDX-License-Identifier: GPL-2.0+
11 struct blk_driver
*blk_driver_lookup_type(int if_type
)
13 struct blk_driver
*drv
= ll_entry_start(struct blk_driver
, blk_driver
);
14 const int n_ents
= ll_entry_count(struct blk_driver
, blk_driver
);
15 struct blk_driver
*entry
;
17 for (entry
= drv
; entry
!= drv
+ n_ents
; entry
++) {
18 if (if_type
== entry
->if_type
)
26 static struct blk_driver
*blk_driver_lookup_typename(const char *if_typename
)
28 struct blk_driver
*drv
= ll_entry_start(struct blk_driver
, blk_driver
);
29 const int n_ents
= ll_entry_count(struct blk_driver
, blk_driver
);
30 struct blk_driver
*entry
;
32 for (entry
= drv
; entry
!= drv
+ n_ents
; entry
++) {
33 if (!strcmp(if_typename
, entry
->if_typename
))
41 const char *blk_get_if_type_name(enum if_type if_type
)
43 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
45 return drv
? drv
->if_typename
: NULL
;
49 * get_desc() - Get the block device descriptor for the given device number
51 * @drv: Legacy block driver
52 * @devnum: Device number (0 = first)
53 * @descp: Returns block device descriptor on success
54 * @return 0 on success, -ENODEV if there is no such device, -ENOSYS if the
55 * driver does not provide a way to find a device, or other -ve on other
58 static int get_desc(struct blk_driver
*drv
, int devnum
, struct blk_desc
**descp
)
61 if (devnum
< 0 || devnum
>= drv
->max_devs
)
63 *descp
= &drv
->desc
[devnum
];
69 return drv
->get_dev(devnum
, descp
);
72 #ifdef HAVE_BLOCK_DEVICE
73 int blk_list_part(enum if_type if_type
)
75 struct blk_driver
*drv
;
76 struct blk_desc
*desc
;
80 drv
= blk_driver_lookup_type(if_type
);
83 for (ok
= 0, devnum
= 0; devnum
< drv
->max_devs
; ++devnum
) {
84 if (get_desc(drv
, devnum
, &desc
))
86 if (desc
->part_type
!= PART_TYPE_UNKNOWN
) {
100 int blk_print_part_devnum(enum if_type if_type
, int devnum
)
102 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
103 struct blk_desc
*desc
;
108 ret
= get_desc(drv
, devnum
, &desc
);
111 if (desc
->type
== DEV_TYPE_UNKNOWN
)
118 void blk_list_devices(enum if_type if_type
)
120 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
121 struct blk_desc
*desc
;
126 for (i
= 0; i
< drv
->max_devs
; ++i
) {
127 if (get_desc(drv
, i
, &desc
))
129 if (desc
->type
== DEV_TYPE_UNKNOWN
)
130 continue; /* list only known devices */
131 printf("Device %d: ", i
);
136 int blk_print_device_num(enum if_type if_type
, int devnum
)
138 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
139 struct blk_desc
*desc
;
144 ret
= get_desc(drv
, devnum
, &desc
);
147 printf("\n%s device %d: ", drv
->if_typename
, devnum
);
153 int blk_show_device(enum if_type if_type
, int devnum
)
155 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
156 struct blk_desc
*desc
;
161 printf("\nDevice %d: ", devnum
);
162 if (devnum
>= drv
->max_devs
) {
163 puts("unknown device\n");
166 ret
= get_desc(drv
, devnum
, &desc
);
171 if (desc
->type
== DEV_TYPE_UNKNOWN
)
176 #endif /* HAVE_BLOCK_DEVICE */
178 struct blk_desc
*blk_get_devnum_by_type(enum if_type if_type
, int devnum
)
180 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
181 struct blk_desc
*desc
;
186 if (get_desc(drv
, devnum
, &desc
))
192 int blk_dselect_hwpart(struct blk_desc
*desc
, int hwpart
)
194 struct blk_driver
*drv
= blk_driver_lookup_type(desc
->if_type
);
198 if (drv
->select_hwpart
)
199 return drv
->select_hwpart(desc
, hwpart
);
204 struct blk_desc
*blk_get_devnum_by_typename(const char *if_typename
, int devnum
)
206 struct blk_driver
*drv
= blk_driver_lookup_typename(if_typename
);
207 struct blk_desc
*desc
;
212 if (get_desc(drv
, devnum
, &desc
))
218 ulong
blk_read_devnum(enum if_type if_type
, int devnum
, lbaint_t start
,
219 lbaint_t blkcnt
, void *buffer
)
221 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
222 struct blk_desc
*desc
;
228 ret
= get_desc(drv
, devnum
, &desc
);
231 n
= desc
->block_read(desc
, start
, blkcnt
, buffer
);
238 ulong
blk_write_devnum(enum if_type if_type
, int devnum
, lbaint_t start
,
239 lbaint_t blkcnt
, const void *buffer
)
241 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
242 struct blk_desc
*desc
;
247 ret
= get_desc(drv
, devnum
, &desc
);
250 return desc
->block_write(desc
, start
, blkcnt
, buffer
);
253 int blk_select_hwpart_devnum(enum if_type if_type
, int devnum
, int hwpart
)
255 struct blk_driver
*drv
= blk_driver_lookup_type(if_type
);
256 struct blk_desc
*desc
;
261 ret
= get_desc(drv
, devnum
, &desc
);
264 return drv
->select_hwpart(desc
, hwpart
);