root / hw / block-common.h @ 3871481c
History | View | Annotate | Download (2.5 kB)
1 | 9db1c0f7 | Markus Armbruster | /*
|
---|---|---|---|
2 | 9db1c0f7 | Markus Armbruster | * Common code for block device models
|
3 | 9db1c0f7 | Markus Armbruster | *
|
4 | 9db1c0f7 | Markus Armbruster | * Copyright (C) 2012 Red Hat, Inc.
|
5 | 9db1c0f7 | Markus Armbruster | * Copyright (c) 2003-2008 Fabrice Bellard
|
6 | 9db1c0f7 | Markus Armbruster | *
|
7 | 9db1c0f7 | Markus Armbruster | * This work is licensed under the terms of the GNU GPL, version 2 or
|
8 | 9db1c0f7 | Markus Armbruster | * later. See the COPYING file in the top-level directory.
|
9 | 9db1c0f7 | Markus Armbruster | */
|
10 | 9db1c0f7 | Markus Armbruster | |
11 | 9db1c0f7 | Markus Armbruster | #ifndef HW_BLOCK_COMMON_H
|
12 | 9db1c0f7 | Markus Armbruster | #define HW_BLOCK_COMMON_H
|
13 | 9db1c0f7 | Markus Armbruster | |
14 | 9db1c0f7 | Markus Armbruster | #include "qemu-common.h" |
15 | 9db1c0f7 | Markus Armbruster | |
16 | 31e404f4 | Markus Armbruster | /* Configuration */
|
17 | 31e404f4 | Markus Armbruster | |
18 | 31e404f4 | Markus Armbruster | typedef struct BlockConf { |
19 | 31e404f4 | Markus Armbruster | BlockDriverState *bs; |
20 | 31e404f4 | Markus Armbruster | uint16_t physical_block_size; |
21 | 31e404f4 | Markus Armbruster | uint16_t logical_block_size; |
22 | 31e404f4 | Markus Armbruster | uint16_t min_io_size; |
23 | 31e404f4 | Markus Armbruster | uint32_t opt_io_size; |
24 | 31e404f4 | Markus Armbruster | int32_t bootindex; |
25 | 31e404f4 | Markus Armbruster | uint32_t discard_granularity; |
26 | 31e404f4 | Markus Armbruster | /* geometry, not all devices use this */
|
27 | 31e404f4 | Markus Armbruster | uint32_t cyls, heads, secs; |
28 | 31e404f4 | Markus Armbruster | } BlockConf; |
29 | 31e404f4 | Markus Armbruster | |
30 | 31e404f4 | Markus Armbruster | static inline unsigned int get_physical_block_exp(BlockConf *conf) |
31 | 31e404f4 | Markus Armbruster | { |
32 | 31e404f4 | Markus Armbruster | unsigned int exp = 0, size; |
33 | 31e404f4 | Markus Armbruster | |
34 | 31e404f4 | Markus Armbruster | for (size = conf->physical_block_size;
|
35 | 31e404f4 | Markus Armbruster | size > conf->logical_block_size; |
36 | 31e404f4 | Markus Armbruster | size >>= 1) {
|
37 | 31e404f4 | Markus Armbruster | exp++; |
38 | 31e404f4 | Markus Armbruster | } |
39 | 31e404f4 | Markus Armbruster | |
40 | 31e404f4 | Markus Armbruster | return exp;
|
41 | 31e404f4 | Markus Armbruster | } |
42 | 31e404f4 | Markus Armbruster | |
43 | 31e404f4 | Markus Armbruster | #define DEFINE_BLOCK_PROPERTIES(_state, _conf) \
|
44 | 31e404f4 | Markus Armbruster | DEFINE_PROP_DRIVE("drive", _state, _conf.bs), \
|
45 | 31e404f4 | Markus Armbruster | DEFINE_PROP_BLOCKSIZE("logical_block_size", _state, \
|
46 | 31e404f4 | Markus Armbruster | _conf.logical_block_size, 512), \
|
47 | 31e404f4 | Markus Armbruster | DEFINE_PROP_BLOCKSIZE("physical_block_size", _state, \
|
48 | 31e404f4 | Markus Armbruster | _conf.physical_block_size, 512), \
|
49 | 31e404f4 | Markus Armbruster | DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0), \ |
50 | 31e404f4 | Markus Armbruster | DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0), \ |
51 | 31e404f4 | Markus Armbruster | DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1), \ |
52 | 31e404f4 | Markus Armbruster | DEFINE_PROP_UINT32("discard_granularity", _state, \
|
53 | 31e404f4 | Markus Armbruster | _conf.discard_granularity, 0)
|
54 | 31e404f4 | Markus Armbruster | |
55 | 31e404f4 | Markus Armbruster | #define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf) \
|
56 | 31e404f4 | Markus Armbruster | DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0), \ |
57 | 31e404f4 | Markus Armbruster | DEFINE_PROP_UINT32("heads", _state, _conf.heads, 0), \ |
58 | 31e404f4 | Markus Armbruster | DEFINE_PROP_UINT32("secs", _state, _conf.secs, 0) |
59 | 31e404f4 | Markus Armbruster | |
60 | 911525db | Markus Armbruster | /* Configuration helpers */
|
61 | 911525db | Markus Armbruster | |
62 | 911525db | Markus Armbruster | void blkconf_serial(BlockConf *conf, char **serial); |
63 | b7eb0c9f | Markus Armbruster | int blkconf_geometry(BlockConf *conf, int *trans, |
64 | b7eb0c9f | Markus Armbruster | unsigned cyls_max, unsigned heads_max, unsigned secs_max); |
65 | 31e404f4 | Markus Armbruster | |
66 | 9db1c0f7 | Markus Armbruster | /* Hard disk geometry */
|
67 | 9db1c0f7 | Markus Armbruster | |
68 | 2b584959 | Markus Armbruster | #define BIOS_ATA_TRANSLATION_AUTO 0 |
69 | 2b584959 | Markus Armbruster | #define BIOS_ATA_TRANSLATION_NONE 1 |
70 | 2b584959 | Markus Armbruster | #define BIOS_ATA_TRANSLATION_LBA 2 |
71 | 2b584959 | Markus Armbruster | #define BIOS_ATA_TRANSLATION_LARGE 3 |
72 | 2b584959 | Markus Armbruster | #define BIOS_ATA_TRANSLATION_RECHS 4 |
73 | 2b584959 | Markus Armbruster | |
74 | 9db1c0f7 | Markus Armbruster | void hd_geometry_guess(BlockDriverState *bs,
|
75 | 1f24d7b4 | Markus Armbruster | uint32_t *pcyls, uint32_t *pheads, uint32_t *psecs, |
76 | e2f3dc2b | Markus Armbruster | int *ptrans);
|
77 | 2adc99b2 | Markus Armbruster | int hd_bios_chs_auto_trans(uint32_t cyls, uint32_t heads, uint32_t secs);
|
78 | 9db1c0f7 | Markus Armbruster | |
79 | 9db1c0f7 | Markus Armbruster | #endif |