root / hw / i82374.c @ 23b96cdb
History | View | Annotate | Download (4.3 kB)
1 |
/*
|
---|---|
2 |
* QEMU Intel 82374 emulation (Enhanced DMA controller)
|
3 |
*
|
4 |
* Copyright (c) 2010 Hervé Poussineau
|
5 |
*
|
6 |
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
7 |
* of this software and associated documentation files (the "Software"), to deal
|
8 |
* in the Software without restriction, including without limitation the rights
|
9 |
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10 |
* copies of the Software, and to permit persons to whom the Software is
|
11 |
* furnished to do so, subject to the following conditions:
|
12 |
*
|
13 |
* The above copyright notice and this permission notice shall be included in
|
14 |
* all copies or substantial portions of the Software.
|
15 |
*
|
16 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17 |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18 |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
19 |
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20 |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22 |
* THE SOFTWARE.
|
23 |
*/
|
24 |
|
25 |
#include "isa.h" |
26 |
|
27 |
//#define DEBUG_I82374
|
28 |
|
29 |
#ifdef DEBUG_I82374
|
30 |
#define DPRINTF(fmt, ...) \
|
31 |
do { fprintf(stderr, "i82374: " fmt , ## __VA_ARGS__); } while (0) |
32 |
#else
|
33 |
#define DPRINTF(fmt, ...) \
|
34 |
do {} while (0) |
35 |
#endif
|
36 |
#define BADF(fmt, ...) \
|
37 |
do { fprintf(stderr, "i82374 ERROR: " fmt , ## __VA_ARGS__); } while (0) |
38 |
|
39 |
typedef struct I82374State { |
40 |
uint8_t commands[8];
|
41 |
} I82374State; |
42 |
|
43 |
static const VMStateDescription vmstate_i82374 = { |
44 |
.name = "i82374",
|
45 |
.version_id = 0,
|
46 |
.minimum_version_id = 0,
|
47 |
.fields = (VMStateField[]) { |
48 |
VMSTATE_UINT8_ARRAY(commands, I82374State, 8),
|
49 |
VMSTATE_END_OF_LIST() |
50 |
}, |
51 |
}; |
52 |
|
53 |
static uint32_t i82374_read_isr(void *opaque, uint32_t nport) |
54 |
{ |
55 |
uint32_t val = 0;
|
56 |
|
57 |
BADF("%s: %08x\n", __func__, nport);
|
58 |
|
59 |
DPRINTF("%s: %08x=%08x\n", __func__, nport, val);
|
60 |
return val;
|
61 |
} |
62 |
|
63 |
static void i82374_write_command(void *opaque, uint32_t nport, uint32_t data) |
64 |
{ |
65 |
DPRINTF("%s: %08x=%08x\n", __func__, nport, data);
|
66 |
|
67 |
if (data != 0x42) { |
68 |
/* Not Stop S/G command */
|
69 |
BADF("%s: %08x=%08x\n", __func__, nport, data);
|
70 |
} |
71 |
} |
72 |
|
73 |
static uint32_t i82374_read_status(void *opaque, uint32_t nport) |
74 |
{ |
75 |
uint32_t val = 0;
|
76 |
|
77 |
BADF("%s: %08x\n", __func__, nport);
|
78 |
|
79 |
DPRINTF("%s: %08x=%08x\n", __func__, nport, val);
|
80 |
return val;
|
81 |
} |
82 |
|
83 |
static void i82374_write_descriptor(void *opaque, uint32_t nport, uint32_t data) |
84 |
{ |
85 |
DPRINTF("%s: %08x=%08x\n", __func__, nport, data);
|
86 |
|
87 |
BADF("%s: %08x=%08x\n", __func__, nport, data);
|
88 |
} |
89 |
|
90 |
static uint32_t i82374_read_descriptor(void *opaque, uint32_t nport) |
91 |
{ |
92 |
uint32_t val = 0;
|
93 |
|
94 |
BADF("%s: %08x\n", __func__, nport);
|
95 |
|
96 |
DPRINTF("%s: %08x=%08x\n", __func__, nport, val);
|
97 |
return val;
|
98 |
} |
99 |
|
100 |
static void i82374_init(I82374State *s) |
101 |
{ |
102 |
DMA_init(1, NULL); |
103 |
memset(s->commands, 0, sizeof(s->commands)); |
104 |
} |
105 |
|
106 |
typedef struct ISAi82374State { |
107 |
ISADevice dev; |
108 |
uint32_t iobase; |
109 |
I82374State state; |
110 |
} ISAi82374State; |
111 |
|
112 |
static const VMStateDescription vmstate_isa_i82374 = { |
113 |
.name = "isa-i82374",
|
114 |
.version_id = 0,
|
115 |
.minimum_version_id = 0,
|
116 |
.fields = (VMStateField[]) { |
117 |
VMSTATE_STRUCT(state, ISAi82374State, 0, vmstate_i82374, I82374State),
|
118 |
VMSTATE_END_OF_LIST() |
119 |
}, |
120 |
}; |
121 |
|
122 |
static int i82374_isa_init(ISADevice *dev) |
123 |
{ |
124 |
ISAi82374State *isa = DO_UPCAST(ISAi82374State, dev, dev); |
125 |
I82374State *s = &isa->state; |
126 |
|
127 |
register_ioport_read(isa->iobase + 0x0A, 1, 1, i82374_read_isr, s); |
128 |
register_ioport_write(isa->iobase + 0x10, 8, 1, i82374_write_command, s); |
129 |
register_ioport_read(isa->iobase + 0x18, 8, 1, i82374_read_status, s); |
130 |
register_ioport_write(isa->iobase + 0x20, 0x20, 1, i82374_write_descriptor, s); |
131 |
register_ioport_read(isa->iobase + 0x20, 0x20, 1, i82374_read_descriptor, s); |
132 |
|
133 |
i82374_init(s); |
134 |
|
135 |
return 0; |
136 |
} |
137 |
|
138 |
static ISADeviceInfo i82374_isa_info = {
|
139 |
.qdev.name = "i82374",
|
140 |
.qdev.size = sizeof(ISAi82374State),
|
141 |
.qdev.vmsd = &vmstate_isa_i82374, |
142 |
.init = i82374_isa_init, |
143 |
.qdev.props = (Property[]) { |
144 |
DEFINE_PROP_HEX32("iobase", ISAi82374State, iobase, 0x400), |
145 |
DEFINE_PROP_END_OF_LIST() |
146 |
}, |
147 |
}; |
148 |
|
149 |
static void i82374_register_devices(void) |
150 |
{ |
151 |
isa_qdev_register(&i82374_isa_info); |
152 |
} |
153 |
|
154 |
device_init(i82374_register_devices) |