Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
virtio_config.h
Go to the documentation of this file.
1
#ifndef _LINUX_VIRTIO_CONFIG_H
2
#define _LINUX_VIRTIO_CONFIG_H
3
4
#include <
linux/err.h
>
5
#include <
linux/bug.h
>
6
#include <linux/virtio.h>
7
#include <
uapi/linux/virtio_config.h
>
8
55
typedef
void
vq_callback_t
(
struct
virtqueue
*);
56
struct
virtio_config_ops
{
57
void
(*
get
)(
struct
virtio_device
*vdev,
unsigned
offset
,
58
void
*
buf
,
unsigned
len
);
59
void
(*
set
)(
struct
virtio_device
*vdev,
unsigned
offset
,
60
const
void
*
buf
,
unsigned
len
);
61
u8
(*
get_status
)(
struct
virtio_device
*vdev);
62
void
(*
set_status
)(
struct
virtio_device
*vdev,
u8
status
);
63
void
(*
reset
)(
struct
virtio_device
*vdev);
64
int
(*
find_vqs
)(
struct
virtio_device
*,
unsigned
nvqs,
65
struct
virtqueue
*vqs[],
66
vq_callback_t
*callbacks[],
67
const
char
*names[]);
68
void
(*
del_vqs
)(
struct
virtio_device
*);
69
u32
(*
get_features
)(
struct
virtio_device
*vdev);
70
void
(*
finalize_features
)(
struct
virtio_device
*vdev);
71
const
char
*(*bus_name)(
struct
virtio_device
*vdev);
72
int
(*
set_vq_affinity
)(
struct
virtqueue
*vq,
int
cpu
);
73
};
74
75
/* If driver didn't advertise the feature, it will never appear. */
76
void
virtio_check_driver_offered_feature
(
const
struct
virtio_device
*
vdev
,
77
unsigned
int
fbit);
78
84
static
inline
bool
virtio_has_feature
(
const
struct
virtio_device
*
vdev
,
85
unsigned
int
fbit)
86
{
87
/* Did you forget to fix assumptions on max features? */
88
if
(__builtin_constant_p(fbit))
89
BUILD_BUG_ON
(fbit >= 32);
90
else
91
BUG_ON
(fbit >= 32);
92
93
if
(fbit <
VIRTIO_TRANSPORT_F_START
)
94
virtio_check_driver_offered_feature
(vdev, fbit);
95
96
return
test_bit
(fbit, vdev->
features
);
97
}
98
108
#define virtio_config_val(vdev, fbit, offset, v) \
109
virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(*v))
110
111
#define virtio_config_val_len(vdev, fbit, offset, v, len) \
112
virtio_config_buf((vdev), (fbit), (offset), (v), (len))
113
114
static
inline
int
virtio_config_buf(
struct
virtio_device
*vdev,
115
unsigned
int
fbit,
116
unsigned
int
offset
,
117
void
*
buf
,
unsigned
len)
118
{
119
if
(!
virtio_has_feature
(vdev, fbit))
120
return
-
ENOENT
;
121
122
vdev->
config
->get(vdev, offset, buf, len);
123
return
0;
124
}
125
126
static
inline
127
struct
virtqueue
*virtio_find_single_vq(
struct
virtio_device
*vdev,
128
vq_callback_t
*
c
,
const
char
*
n
)
129
{
130
vq_callback_t
*callbacks[] = { c };
131
const
char
*names[] = { n };
132
struct
virtqueue
*vq;
133
int
err
= vdev->
config
->find_vqs(vdev, 1, &vq, callbacks, names);
134
if
(err < 0)
135
return
ERR_PTR(err);
136
return
vq;
137
}
138
139
static
inline
140
const
char
*virtio_bus_name(
struct
virtio_device
*vdev)
141
{
142
if
(!vdev->
config
->bus_name)
143
return
"virtio"
;
144
return
vdev->
config
->bus_name(vdev);
145
}
146
156
static
inline
157
int
virtqueue_set_affinity(
struct
virtqueue
*vq,
int
cpu
)
158
{
159
struct
virtio_device
*vdev = vq->
vdev
;
160
if
(vdev->
config
->set_vq_affinity)
161
return
vdev->
config
->set_vq_affinity(vq, cpu);
162
return
0;
163
}
164
165
166
#endif
/* _LINUX_VIRTIO_CONFIG_H */
Generated on Thu Jan 10 2013 14:52:50 for Linux Kernel by
1.8.2