1
From c4fe135074cc48e7215e6eed04b4ae958c412ee4 Mon Sep 17 00:00:00 2001
2
From: Kevin O'Connor <kevin@koconnor.net>
3
Date: Thu, 20 May 2010 00:22:02 -0400
4
Subject: [PATCH 20/54] Minor - split up virtio_blk_setup().
6
Split function to make it more readable.
8
Also, report all found virtio devices at debug level 1.
10
src/virtio-blk.c | 143 ++++++++++++++++++++++++++++--------------------------
11
1 files changed, 74 insertions(+), 69 deletions(-)
13
diff --git a/src/virtio-blk.c b/src/virtio-blk.c
14
index e6167e9..7f9b3d2 100644
15
--- a/src/virtio-blk.c
16
+++ b/src/virtio-blk.c
17
@@ -85,6 +85,79 @@ process_virtio_op(struct disk_op_s *op)
22
+init_virtio_blk(u16 bdf)
24
+ dprintf(1, "found virtio-blk at %x:%x\n", pci_bdf_to_bus(bdf),
25
+ pci_bdf_to_dev(bdf));
26
+ char *desc = malloc_tmphigh(MAXDESCSIZE);
27
+ struct virtiodrive_s *vdrive_g = malloc_fseg(sizeof(*vdrive_g));
28
+ struct vring_virtqueue *vq = memalign_low(PAGE_SIZE, sizeof(*vq));
29
+ if (!vdrive_g || !desc || !vq) {
33
+ memset(vdrive_g, 0, sizeof(*vdrive_g));
34
+ vdrive_g->drive.type = DTYPE_VIRTIO;
35
+ vdrive_g->drive.cntl_id = bdf;
38
+ u16 ioaddr = pci_config_readl(bdf, PCI_BASE_ADDRESS_0) &
39
+ PCI_BASE_ADDRESS_IO_MASK;
41
+ vdrive_g->ioaddr = ioaddr;
44
+ vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE |
45
+ VIRTIO_CONFIG_S_DRIVER );
47
+ if (vp_find_vq(ioaddr, 0, vdrive_g->vq) < 0 ) {
48
+ dprintf(1, "fail to find vq for virtio-blk %x:%x\n",
49
+ pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf));
53
+ struct virtio_blk_config cfg;
54
+ vp_get(ioaddr, 0, &cfg, sizeof(cfg));
56
+ u32 f = vp_get_features(ioaddr);
57
+ vdrive_g->drive.blksize = (f & (1 << VIRTIO_BLK_F_BLK_SIZE)) ?
58
+ cfg.blk_size : DISK_SECTOR_SIZE;
60
+ vdrive_g->drive.sectors = cfg.capacity;
61
+ dprintf(3, "virtio-blk %x:%x blksize=%d sectors=%u\n",
62
+ pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf),
63
+ vdrive_g->drive.blksize, (u32)vdrive_g->drive.sectors);
65
+ if (vdrive_g->drive.blksize != DISK_SECTOR_SIZE) {
66
+ dprintf(1, "virtio-blk %x:%x block size %d is unsupported\n",
67
+ pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf),
68
+ vdrive_g->drive.blksize);
72
+ vdrive_g->drive.pchs.cylinders = cfg.cylinders;
73
+ vdrive_g->drive.pchs.heads = cfg.heads;
74
+ vdrive_g->drive.pchs.spt = cfg.sectors;
76
+ setup_translation(&vdrive_g->drive);
77
+ add_bcv_internal(&vdrive_g->drive);
79
+ snprintf(desc, MAXDESCSIZE, "Virtio disk PCI:%x:%x",
80
+ pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf));
82
+ vdrive_g->drive.desc = desc;
84
+ vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE |
85
+ VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK);
95
virtio_blk_setup(void)
97
@@ -100,74 +173,6 @@ virtio_blk_setup(void)
98
u32 v = pci_config_readl(bdf, PCI_VENDOR_ID);
101
- dprintf(3, "found virtio-blk at %x:%x\n", pci_bdf_to_bus(bdf),
102
- pci_bdf_to_dev(bdf));
103
- char *desc = malloc_tmphigh(MAXDESCSIZE);
104
- struct virtiodrive_s *vdrive_g = malloc_fseg(sizeof(*vdrive_g));
105
- struct vring_virtqueue *vq = memalign_low(PAGE_SIZE, sizeof(*vq));
106
- if (!vdrive_g || !desc || !vq) {
113
- memset(vdrive_g, 0, sizeof(*vdrive_g));
114
- vdrive_g->drive.type = DTYPE_VIRTIO;
115
- vdrive_g->drive.cntl_id = bdf;
118
- u16 ioaddr = pci_config_readl(bdf, PCI_BASE_ADDRESS_0) &
119
- PCI_BASE_ADDRESS_IO_MASK;
121
- vdrive_g->ioaddr = ioaddr;
124
- vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE |
125
- VIRTIO_CONFIG_S_DRIVER );
127
- if (vp_find_vq(ioaddr, 0, vdrive_g->vq) < 0 ) {
128
- dprintf(1, "fail to find vq for virtio-blk %x:%x\n",
129
- pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf));
137
- struct virtio_blk_config cfg;
138
- vp_get(ioaddr, 0, &cfg, sizeof(cfg));
140
- u32 f = vp_get_features(ioaddr);
141
- vdrive_g->drive.blksize = (f & (1 << VIRTIO_BLK_F_BLK_SIZE)) ?
142
- cfg.blk_size : DISK_SECTOR_SIZE;
144
- vdrive_g->drive.sectors = cfg.capacity;
145
- dprintf(3, "virtio-blk %x:%x blksize=%d sectors=%u\n",
146
- pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf),
147
- vdrive_g->drive.blksize, (u32)vdrive_g->drive.sectors);
149
- if (vdrive_g->drive.blksize != DISK_SECTOR_SIZE) {
150
- dprintf(1, "virtio-blk %x:%x block size %d is unsupported\n",
151
- pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf),
152
- vdrive_g->drive.blksize);
156
- vdrive_g->drive.pchs.cylinders = cfg.cylinders;
157
- vdrive_g->drive.pchs.heads = cfg.heads;
158
- vdrive_g->drive.pchs.spt = cfg.sectors;
160
- setup_translation(&vdrive_g->drive);
161
- add_bcv_internal(&vdrive_g->drive);
163
- snprintf(desc, MAXDESCSIZE, "Virtio disk PCI:%x:%x",
164
- pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf));
166
- vdrive_g->drive.desc = desc;
168
- vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE |
169
- VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK);
170
+ init_virtio_blk(bdf);