Revision a90ffa49
b/hw/ac97.c | ||
---|---|---|
1167 | 1167 |
transfer_audio (opaque, PO_INDEX, free); |
1168 | 1168 |
} |
1169 | 1169 |
|
1170 |
static void ac97_save (QEMUFile *f, void *opaque) |
|
1171 |
{ |
|
1172 |
size_t i; |
|
1173 |
AC97LinkState *s = opaque; |
|
1174 |
|
|
1175 |
pci_device_save (&s->dev, f); |
|
1176 |
|
|
1177 |
qemu_put_be32s (f, &s->glob_cnt); |
|
1178 |
qemu_put_be32s (f, &s->glob_sta); |
|
1179 |
qemu_put_be32s (f, &s->cas); |
|
1180 |
|
|
1181 |
for (i = 0; i < ARRAY_SIZE (s->bm_regs); ++i) { |
|
1182 |
AC97BusMasterRegs *r = &s->bm_regs[i]; |
|
1183 |
qemu_put_be32s (f, &r->bdbar); |
|
1184 |
qemu_put_8s (f, &r->civ); |
|
1185 |
qemu_put_8s (f, &r->lvi); |
|
1186 |
qemu_put_be16s (f, &r->sr); |
|
1187 |
qemu_put_be16s (f, &r->picb); |
|
1188 |
qemu_put_8s (f, &r->piv); |
|
1189 |
qemu_put_8s (f, &r->cr); |
|
1190 |
qemu_put_be32s (f, &r->bd_valid); |
|
1191 |
qemu_put_be32s (f, &r->bd.addr); |
|
1192 |
qemu_put_be32s (f, &r->bd.ctl_len); |
|
1170 |
static const VMStateDescription vmstate_ac97_bm_regs = { |
|
1171 |
.name = "ac97_bm_regs", |
|
1172 |
.version_id = 1, |
|
1173 |
.minimum_version_id = 1, |
|
1174 |
.minimum_version_id_old = 1, |
|
1175 |
.fields = (VMStateField []) { |
|
1176 |
VMSTATE_UINT32(bdbar, AC97BusMasterRegs), |
|
1177 |
VMSTATE_UINT8(civ, AC97BusMasterRegs), |
|
1178 |
VMSTATE_UINT8(lvi, AC97BusMasterRegs), |
|
1179 |
VMSTATE_UINT16(sr, AC97BusMasterRegs), |
|
1180 |
VMSTATE_UINT16(picb, AC97BusMasterRegs), |
|
1181 |
VMSTATE_UINT8(piv, AC97BusMasterRegs), |
|
1182 |
VMSTATE_UINT8(cr, AC97BusMasterRegs), |
|
1183 |
VMSTATE_UINT32(bd_valid, AC97BusMasterRegs), |
|
1184 |
VMSTATE_UINT32(bd.addr, AC97BusMasterRegs), |
|
1185 |
VMSTATE_UINT32(bd.ctl_len, AC97BusMasterRegs), |
|
1186 |
VMSTATE_END_OF_LIST() |
|
1193 | 1187 |
} |
1194 |
qemu_put_buffer (f, s->mixer_data, sizeof (s->mixer_data)); |
|
1195 |
} |
|
1188 |
}; |
|
1196 | 1189 |
|
1197 |
static int ac97_load (QEMUFile *f, void *opaque, int version_id)
|
|
1190 |
static int ac97_post_load (void *opaque, int version_id)
|
|
1198 | 1191 |
{ |
1199 |
int ret; |
|
1200 |
size_t i; |
|
1201 | 1192 |
uint8_t active[LAST_INDEX]; |
1202 | 1193 |
AC97LinkState *s = opaque; |
1203 | 1194 |
|
1204 |
if (version_id < 2 || version_id > 3) |
|
1205 |
return -EINVAL; |
|
1206 |
|
|
1207 |
ret = pci_device_load (&s->dev, f); |
|
1208 |
if (ret) |
|
1209 |
return ret; |
|
1210 |
|
|
1211 |
qemu_get_be32s (f, &s->glob_cnt); |
|
1212 |
qemu_get_be32s (f, &s->glob_sta); |
|
1213 |
qemu_get_be32s (f, &s->cas); |
|
1214 |
|
|
1215 |
for (i = 0; i < ARRAY_SIZE (s->bm_regs); ++i) { |
|
1216 |
AC97BusMasterRegs *r = &s->bm_regs[i]; |
|
1217 |
qemu_get_be32s (f, &r->bdbar); |
|
1218 |
qemu_get_8s (f, &r->civ); |
|
1219 |
qemu_get_8s (f, &r->lvi); |
|
1220 |
qemu_get_be16s (f, &r->sr); |
|
1221 |
qemu_get_be16s (f, &r->picb); |
|
1222 |
qemu_get_8s (f, &r->piv); |
|
1223 |
qemu_get_8s (f, &r->cr); |
|
1224 |
qemu_get_be32s (f, &r->bd_valid); |
|
1225 |
qemu_get_be32s (f, &r->bd.addr); |
|
1226 |
qemu_get_be32s (f, &r->bd.ctl_len); |
|
1227 |
} |
|
1228 |
qemu_get_buffer (f, s->mixer_data, sizeof (s->mixer_data)); |
|
1229 |
if (version_id < 3) |
|
1230 |
qemu_get_buffer (f, active, sizeof (active)); |
|
1231 |
|
|
1232 | 1195 |
#ifdef USE_MIXER |
1233 | 1196 |
record_select (s, mixer_load (s, AC97_Record_Select)); |
1234 | 1197 |
#define V_(a, b) set_volume (s, a, b, mixer_load (s, a)) |
... | ... | |
1247 | 1210 |
return 0; |
1248 | 1211 |
} |
1249 | 1212 |
|
1213 |
static bool is_version_2 (void *opaque, int version_id) |
|
1214 |
{ |
|
1215 |
return version_id == 2; |
|
1216 |
} |
|
1217 |
|
|
1218 |
static const VMStateDescription vmstate_ac97 = { |
|
1219 |
.name = "ac97", |
|
1220 |
.version_id = 3, |
|
1221 |
.minimum_version_id = 2, |
|
1222 |
.minimum_version_id_old = 2, |
|
1223 |
.post_load = ac97_post_load, |
|
1224 |
.fields = (VMStateField []) { |
|
1225 |
VMSTATE_PCI_DEVICE(dev, AC97LinkState), |
|
1226 |
VMSTATE_UINT32(glob_cnt, AC97LinkState), |
|
1227 |
VMSTATE_UINT32(glob_sta, AC97LinkState), |
|
1228 |
VMSTATE_UINT32(cas, AC97LinkState), |
|
1229 |
VMSTATE_STRUCT_ARRAY(bm_regs, AC97LinkState, 3, 1, |
|
1230 |
vmstate_ac97_bm_regs, AC97BusMasterRegs), |
|
1231 |
VMSTATE_BUFFER(mixer_data, AC97LinkState), |
|
1232 |
VMSTATE_UNUSED_TEST(is_version_2, 3), |
|
1233 |
VMSTATE_END_OF_LIST() |
|
1234 |
} |
|
1235 |
}; |
|
1236 |
|
|
1250 | 1237 |
static void ac97_map (PCIDevice *pci_dev, int region_num, |
1251 | 1238 |
pcibus_t addr, pcibus_t size, int type) |
1252 | 1239 |
{ |
... | ... | |
1332 | 1319 |
pci_register_bar (&s->dev, 0, 256 * 4, PCI_BASE_ADDRESS_SPACE_IO, |
1333 | 1320 |
ac97_map); |
1334 | 1321 |
pci_register_bar (&s->dev, 1, 64 * 4, PCI_BASE_ADDRESS_SPACE_IO, ac97_map); |
1335 |
register_savevm ("ac97", 0, 3, ac97_save, ac97_load, s);
|
|
1322 |
vmstate_register (0, &vmstate_ac97, s);
|
|
1336 | 1323 |
qemu_register_reset (ac97_on_reset, s); |
1337 | 1324 |
AUD_register_card ("ac97", &s->card); |
1338 | 1325 |
ac97_on_reset (s); |
Also available in: Unified diff