Statistics
| Branch: | Revision:

root / hw / ide / ahci.c @ 5e22c276

History | View | Annotate | Download (35.9 kB)

1 f6ad2e32 Alexander Graf
/*
2 f6ad2e32 Alexander Graf
 * QEMU AHCI Emulation
3 f6ad2e32 Alexander Graf
 *
4 f6ad2e32 Alexander Graf
 * Copyright (c) 2010 qiaochong@loongson.cn
5 f6ad2e32 Alexander Graf
 * Copyright (c) 2010 Roland Elek <elek.roland@gmail.com>
6 f6ad2e32 Alexander Graf
 * Copyright (c) 2010 Sebastian Herbszt <herbszt@gmx.de>
7 f6ad2e32 Alexander Graf
 * Copyright (c) 2010 Alexander Graf <agraf@suse.de>
8 f6ad2e32 Alexander Graf
 *
9 f6ad2e32 Alexander Graf
 * This library is free software; you can redistribute it and/or
10 f6ad2e32 Alexander Graf
 * modify it under the terms of the GNU Lesser General Public
11 f6ad2e32 Alexander Graf
 * License as published by the Free Software Foundation; either
12 f6ad2e32 Alexander Graf
 * version 2 of the License, or (at your option) any later version.
13 f6ad2e32 Alexander Graf
 *
14 f6ad2e32 Alexander Graf
 * This library is distributed in the hope that it will be useful,
15 f6ad2e32 Alexander Graf
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 f6ad2e32 Alexander Graf
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 f6ad2e32 Alexander Graf
 * Lesser General Public License for more details.
18 f6ad2e32 Alexander Graf
 *
19 f6ad2e32 Alexander Graf
 * You should have received a copy of the GNU Lesser General Public
20 f6ad2e32 Alexander Graf
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21 f6ad2e32 Alexander Graf
 *
22 f6ad2e32 Alexander Graf
 */
23 f6ad2e32 Alexander Graf
24 f6ad2e32 Alexander Graf
#include <hw/hw.h>
25 a2cb15b0 Michael S. Tsirkin
#include <hw/pci/msi.h>
26 f6ad2e32 Alexander Graf
#include <hw/pc.h>
27 a2cb15b0 Michael S. Tsirkin
#include <hw/pci/pci.h>
28 d9fa31a3 Rob Herring
#include <hw/sysbus.h>
29 f6ad2e32 Alexander Graf
30 83c9089e Paolo Bonzini
#include "monitor/monitor.h"
31 9c17d615 Paolo Bonzini
#include "sysemu/dma.h"
32 022c62cb Paolo Bonzini
#include "exec/cpu-common.h"
33 f6ad2e32 Alexander Graf
#include "internal.h"
34 f6ad2e32 Alexander Graf
#include <hw/ide/pci.h>
35 03c7a6a8 Sebastian Herbszt
#include <hw/ide/ahci.h>
36 f6ad2e32 Alexander Graf
37 f6ad2e32 Alexander Graf
/* #define DEBUG_AHCI */
38 f6ad2e32 Alexander Graf
39 f6ad2e32 Alexander Graf
#ifdef DEBUG_AHCI
40 f6ad2e32 Alexander Graf
#define DPRINTF(port, fmt, ...) \
41 f6ad2e32 Alexander Graf
do { fprintf(stderr, "ahci: %s: [%d] ", __FUNCTION__, port); \
42 f6ad2e32 Alexander Graf
     fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
43 f6ad2e32 Alexander Graf
#else
44 f6ad2e32 Alexander Graf
#define DPRINTF(port, fmt, ...) do {} while(0)
45 f6ad2e32 Alexander Graf
#endif
46 f6ad2e32 Alexander Graf
47 f6ad2e32 Alexander Graf
static void check_cmd(AHCIState *s, int port);
48 f6ad2e32 Alexander Graf
static int handle_cmd(AHCIState *s,int port,int slot);
49 f6ad2e32 Alexander Graf
static void ahci_reset_port(AHCIState *s, int port);
50 f6ad2e32 Alexander Graf
static void ahci_write_fis_d2h(AHCIDevice *ad, uint8_t *cmd_fis);
51 87e62065 Alexander Graf
static void ahci_init_d2h(AHCIDevice *ad);
52 f6ad2e32 Alexander Graf
53 f6ad2e32 Alexander Graf
static uint32_t  ahci_port_read(AHCIState *s, int port, int offset)
54 f6ad2e32 Alexander Graf
{
55 f6ad2e32 Alexander Graf
    uint32_t val;
56 f6ad2e32 Alexander Graf
    AHCIPortRegs *pr;
57 f6ad2e32 Alexander Graf
    pr = &s->dev[port].port_regs;
58 f6ad2e32 Alexander Graf
59 f6ad2e32 Alexander Graf
    switch (offset) {
60 f6ad2e32 Alexander Graf
    case PORT_LST_ADDR:
61 f6ad2e32 Alexander Graf
        val = pr->lst_addr;
62 f6ad2e32 Alexander Graf
        break;
63 f6ad2e32 Alexander Graf
    case PORT_LST_ADDR_HI:
64 f6ad2e32 Alexander Graf
        val = pr->lst_addr_hi;
65 f6ad2e32 Alexander Graf
        break;
66 f6ad2e32 Alexander Graf
    case PORT_FIS_ADDR:
67 f6ad2e32 Alexander Graf
        val = pr->fis_addr;
68 f6ad2e32 Alexander Graf
        break;
69 f6ad2e32 Alexander Graf
    case PORT_FIS_ADDR_HI:
70 f6ad2e32 Alexander Graf
        val = pr->fis_addr_hi;
71 f6ad2e32 Alexander Graf
        break;
72 f6ad2e32 Alexander Graf
    case PORT_IRQ_STAT:
73 f6ad2e32 Alexander Graf
        val = pr->irq_stat;
74 f6ad2e32 Alexander Graf
        break;
75 f6ad2e32 Alexander Graf
    case PORT_IRQ_MASK:
76 f6ad2e32 Alexander Graf
        val = pr->irq_mask;
77 f6ad2e32 Alexander Graf
        break;
78 f6ad2e32 Alexander Graf
    case PORT_CMD:
79 f6ad2e32 Alexander Graf
        val = pr->cmd;
80 f6ad2e32 Alexander Graf
        break;
81 f6ad2e32 Alexander Graf
    case PORT_TFDATA:
82 f6ad2e32 Alexander Graf
        val = ((uint16_t)s->dev[port].port.ifs[0].error << 8) |
83 f6ad2e32 Alexander Graf
              s->dev[port].port.ifs[0].status;
84 f6ad2e32 Alexander Graf
        break;
85 f6ad2e32 Alexander Graf
    case PORT_SIG:
86 f6ad2e32 Alexander Graf
        val = pr->sig;
87 f6ad2e32 Alexander Graf
        break;
88 f6ad2e32 Alexander Graf
    case PORT_SCR_STAT:
89 f6ad2e32 Alexander Graf
        if (s->dev[port].port.ifs[0].bs) {
90 f6ad2e32 Alexander Graf
            val = SATA_SCR_SSTATUS_DET_DEV_PRESENT_PHY_UP |
91 f6ad2e32 Alexander Graf
                  SATA_SCR_SSTATUS_SPD_GEN1 | SATA_SCR_SSTATUS_IPM_ACTIVE;
92 f6ad2e32 Alexander Graf
        } else {
93 f6ad2e32 Alexander Graf
            val = SATA_SCR_SSTATUS_DET_NODEV;
94 f6ad2e32 Alexander Graf
        }
95 f6ad2e32 Alexander Graf
        break;
96 f6ad2e32 Alexander Graf
    case PORT_SCR_CTL:
97 f6ad2e32 Alexander Graf
        val = pr->scr_ctl;
98 f6ad2e32 Alexander Graf
        break;
99 f6ad2e32 Alexander Graf
    case PORT_SCR_ERR:
100 f6ad2e32 Alexander Graf
        val = pr->scr_err;
101 f6ad2e32 Alexander Graf
        break;
102 f6ad2e32 Alexander Graf
    case PORT_SCR_ACT:
103 f6ad2e32 Alexander Graf
        pr->scr_act &= ~s->dev[port].finished;
104 f6ad2e32 Alexander Graf
        s->dev[port].finished = 0;
105 f6ad2e32 Alexander Graf
        val = pr->scr_act;
106 f6ad2e32 Alexander Graf
        break;
107 f6ad2e32 Alexander Graf
    case PORT_CMD_ISSUE:
108 f6ad2e32 Alexander Graf
        val = pr->cmd_issue;
109 f6ad2e32 Alexander Graf
        break;
110 f6ad2e32 Alexander Graf
    case PORT_RESERVED:
111 f6ad2e32 Alexander Graf
    default:
112 f6ad2e32 Alexander Graf
        val = 0;
113 f6ad2e32 Alexander Graf
    }
114 f6ad2e32 Alexander Graf
    DPRINTF(port, "offset: 0x%x val: 0x%x\n", offset, val);
115 f6ad2e32 Alexander Graf
    return val;
116 f6ad2e32 Alexander Graf
117 f6ad2e32 Alexander Graf
}
118 f6ad2e32 Alexander Graf
119 f6ad2e32 Alexander Graf
static void ahci_irq_raise(AHCIState *s, AHCIDevice *dev)
120 f6ad2e32 Alexander Graf
{
121 f6ad2e32 Alexander Graf
    struct AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
122 f6ad2e32 Alexander Graf
123 f6ad2e32 Alexander Graf
    DPRINTF(0, "raise irq\n");
124 f6ad2e32 Alexander Graf
125 f6ad2e32 Alexander Graf
    if (msi_enabled(&d->card)) {
126 f6ad2e32 Alexander Graf
        msi_notify(&d->card, 0);
127 f6ad2e32 Alexander Graf
    } else {
128 f6ad2e32 Alexander Graf
        qemu_irq_raise(s->irq);
129 f6ad2e32 Alexander Graf
    }
130 f6ad2e32 Alexander Graf
}
131 f6ad2e32 Alexander Graf
132 f6ad2e32 Alexander Graf
static void ahci_irq_lower(AHCIState *s, AHCIDevice *dev)
133 f6ad2e32 Alexander Graf
{
134 f6ad2e32 Alexander Graf
    struct AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
135 f6ad2e32 Alexander Graf
136 f6ad2e32 Alexander Graf
    DPRINTF(0, "lower irq\n");
137 f6ad2e32 Alexander Graf
138 f6ad2e32 Alexander Graf
    if (!msi_enabled(&d->card)) {
139 f6ad2e32 Alexander Graf
        qemu_irq_lower(s->irq);
140 f6ad2e32 Alexander Graf
    }
141 f6ad2e32 Alexander Graf
}
142 f6ad2e32 Alexander Graf
143 f6ad2e32 Alexander Graf
static void ahci_check_irq(AHCIState *s)
144 f6ad2e32 Alexander Graf
{
145 f6ad2e32 Alexander Graf
    int i;
146 f6ad2e32 Alexander Graf
147 f6ad2e32 Alexander Graf
    DPRINTF(-1, "check irq %#x\n", s->control_regs.irqstatus);
148 f6ad2e32 Alexander Graf
149 b8676728 Alexander Graf
    s->control_regs.irqstatus = 0;
150 2c4b9d0e Alexander Graf
    for (i = 0; i < s->ports; i++) {
151 f6ad2e32 Alexander Graf
        AHCIPortRegs *pr = &s->dev[i].port_regs;
152 f6ad2e32 Alexander Graf
        if (pr->irq_stat & pr->irq_mask) {
153 f6ad2e32 Alexander Graf
            s->control_regs.irqstatus |= (1 << i);
154 f6ad2e32 Alexander Graf
        }
155 f6ad2e32 Alexander Graf
    }
156 f6ad2e32 Alexander Graf
157 f6ad2e32 Alexander Graf
    if (s->control_regs.irqstatus &&
158 f6ad2e32 Alexander Graf
        (s->control_regs.ghc & HOST_CTL_IRQ_EN)) {
159 f6ad2e32 Alexander Graf
            ahci_irq_raise(s, NULL);
160 f6ad2e32 Alexander Graf
    } else {
161 f6ad2e32 Alexander Graf
        ahci_irq_lower(s, NULL);
162 f6ad2e32 Alexander Graf
    }
163 f6ad2e32 Alexander Graf
}
164 f6ad2e32 Alexander Graf
165 f6ad2e32 Alexander Graf
static void ahci_trigger_irq(AHCIState *s, AHCIDevice *d,
166 f6ad2e32 Alexander Graf
                             int irq_type)
167 f6ad2e32 Alexander Graf
{
168 f6ad2e32 Alexander Graf
    DPRINTF(d->port_no, "trigger irq %#x -> %x\n",
169 f6ad2e32 Alexander Graf
            irq_type, d->port_regs.irq_mask & irq_type);
170 f6ad2e32 Alexander Graf
171 f6ad2e32 Alexander Graf
    d->port_regs.irq_stat |= irq_type;
172 f6ad2e32 Alexander Graf
    ahci_check_irq(s);
173 f6ad2e32 Alexander Graf
}
174 f6ad2e32 Alexander Graf
175 f6ad2e32 Alexander Graf
static void map_page(uint8_t **ptr, uint64_t addr, uint32_t wanted)
176 f6ad2e32 Alexander Graf
{
177 a8170e5e Avi Kivity
    hwaddr len = wanted;
178 f6ad2e32 Alexander Graf
179 f6ad2e32 Alexander Graf
    if (*ptr) {
180 fe6ceac8 Stefan Hajnoczi
        cpu_physical_memory_unmap(*ptr, len, 1, len);
181 f6ad2e32 Alexander Graf
    }
182 f6ad2e32 Alexander Graf
183 f6ad2e32 Alexander Graf
    *ptr = cpu_physical_memory_map(addr, &len, 1);
184 f6ad2e32 Alexander Graf
    if (len < wanted) {
185 fe6ceac8 Stefan Hajnoczi
        cpu_physical_memory_unmap(*ptr, len, 1, len);
186 f6ad2e32 Alexander Graf
        *ptr = NULL;
187 f6ad2e32 Alexander Graf
    }
188 f6ad2e32 Alexander Graf
}
189 f6ad2e32 Alexander Graf
190 f6ad2e32 Alexander Graf
static void  ahci_port_write(AHCIState *s, int port, int offset, uint32_t val)
191 f6ad2e32 Alexander Graf
{
192 f6ad2e32 Alexander Graf
    AHCIPortRegs *pr = &s->dev[port].port_regs;
193 f6ad2e32 Alexander Graf
194 f6ad2e32 Alexander Graf
    DPRINTF(port, "offset: 0x%x val: 0x%x\n", offset, val);
195 f6ad2e32 Alexander Graf
    switch (offset) {
196 f6ad2e32 Alexander Graf
        case PORT_LST_ADDR:
197 f6ad2e32 Alexander Graf
            pr->lst_addr = val;
198 f6ad2e32 Alexander Graf
            map_page(&s->dev[port].lst,
199 f6ad2e32 Alexander Graf
                     ((uint64_t)pr->lst_addr_hi << 32) | pr->lst_addr, 1024);
200 f6ad2e32 Alexander Graf
            s->dev[port].cur_cmd = NULL;
201 f6ad2e32 Alexander Graf
            break;
202 f6ad2e32 Alexander Graf
        case PORT_LST_ADDR_HI:
203 f6ad2e32 Alexander Graf
            pr->lst_addr_hi = val;
204 f6ad2e32 Alexander Graf
            map_page(&s->dev[port].lst,
205 f6ad2e32 Alexander Graf
                     ((uint64_t)pr->lst_addr_hi << 32) | pr->lst_addr, 1024);
206 f6ad2e32 Alexander Graf
            s->dev[port].cur_cmd = NULL;
207 f6ad2e32 Alexander Graf
            break;
208 f6ad2e32 Alexander Graf
        case PORT_FIS_ADDR:
209 f6ad2e32 Alexander Graf
            pr->fis_addr = val;
210 f6ad2e32 Alexander Graf
            map_page(&s->dev[port].res_fis,
211 f6ad2e32 Alexander Graf
                     ((uint64_t)pr->fis_addr_hi << 32) | pr->fis_addr, 256);
212 f6ad2e32 Alexander Graf
            break;
213 f6ad2e32 Alexander Graf
        case PORT_FIS_ADDR_HI:
214 f6ad2e32 Alexander Graf
            pr->fis_addr_hi = val;
215 f6ad2e32 Alexander Graf
            map_page(&s->dev[port].res_fis,
216 f6ad2e32 Alexander Graf
                     ((uint64_t)pr->fis_addr_hi << 32) | pr->fis_addr, 256);
217 f6ad2e32 Alexander Graf
            break;
218 f6ad2e32 Alexander Graf
        case PORT_IRQ_STAT:
219 f6ad2e32 Alexander Graf
            pr->irq_stat &= ~val;
220 b8676728 Alexander Graf
            ahci_check_irq(s);
221 f6ad2e32 Alexander Graf
            break;
222 f6ad2e32 Alexander Graf
        case PORT_IRQ_MASK:
223 f6ad2e32 Alexander Graf
            pr->irq_mask = val & 0xfdc000ff;
224 f6ad2e32 Alexander Graf
            ahci_check_irq(s);
225 f6ad2e32 Alexander Graf
            break;
226 f6ad2e32 Alexander Graf
        case PORT_CMD:
227 f6ad2e32 Alexander Graf
            pr->cmd = val & ~(PORT_CMD_LIST_ON | PORT_CMD_FIS_ON);
228 f6ad2e32 Alexander Graf
229 f6ad2e32 Alexander Graf
            if (pr->cmd & PORT_CMD_START) {
230 f6ad2e32 Alexander Graf
                pr->cmd |= PORT_CMD_LIST_ON;
231 f6ad2e32 Alexander Graf
            }
232 f6ad2e32 Alexander Graf
233 f6ad2e32 Alexander Graf
            if (pr->cmd & PORT_CMD_FIS_RX) {
234 f6ad2e32 Alexander Graf
                pr->cmd |= PORT_CMD_FIS_ON;
235 f6ad2e32 Alexander Graf
            }
236 f6ad2e32 Alexander Graf
237 87e62065 Alexander Graf
            /* XXX usually the FIS would be pending on the bus here and
238 87e62065 Alexander Graf
                   issuing deferred until the OS enables FIS receival.
239 87e62065 Alexander Graf
                   Instead, we only submit it once - which works in most
240 87e62065 Alexander Graf
                   cases, but is a hack. */
241 87e62065 Alexander Graf
            if ((pr->cmd & PORT_CMD_FIS_ON) &&
242 87e62065 Alexander Graf
                !s->dev[port].init_d2h_sent) {
243 87e62065 Alexander Graf
                ahci_init_d2h(&s->dev[port]);
244 87e62065 Alexander Graf
                s->dev[port].init_d2h_sent = 1;
245 87e62065 Alexander Graf
            }
246 87e62065 Alexander Graf
247 f6ad2e32 Alexander Graf
            check_cmd(s, port);
248 f6ad2e32 Alexander Graf
            break;
249 f6ad2e32 Alexander Graf
        case PORT_TFDATA:
250 f6ad2e32 Alexander Graf
            s->dev[port].port.ifs[0].error = (val >> 8) & 0xff;
251 f6ad2e32 Alexander Graf
            s->dev[port].port.ifs[0].status = val & 0xff;
252 f6ad2e32 Alexander Graf
            break;
253 f6ad2e32 Alexander Graf
        case PORT_SIG:
254 f6ad2e32 Alexander Graf
            pr->sig = val;
255 f6ad2e32 Alexander Graf
            break;
256 f6ad2e32 Alexander Graf
        case PORT_SCR_STAT:
257 f6ad2e32 Alexander Graf
            pr->scr_stat = val;
258 f6ad2e32 Alexander Graf
            break;
259 f6ad2e32 Alexander Graf
        case PORT_SCR_CTL:
260 f6ad2e32 Alexander Graf
            if (((pr->scr_ctl & AHCI_SCR_SCTL_DET) == 1) &&
261 f6ad2e32 Alexander Graf
                ((val & AHCI_SCR_SCTL_DET) == 0)) {
262 f6ad2e32 Alexander Graf
                ahci_reset_port(s, port);
263 f6ad2e32 Alexander Graf
            }
264 f6ad2e32 Alexander Graf
            pr->scr_ctl = val;
265 f6ad2e32 Alexander Graf
            break;
266 f6ad2e32 Alexander Graf
        case PORT_SCR_ERR:
267 f6ad2e32 Alexander Graf
            pr->scr_err &= ~val;
268 f6ad2e32 Alexander Graf
            break;
269 f6ad2e32 Alexander Graf
        case PORT_SCR_ACT:
270 f6ad2e32 Alexander Graf
            /* RW1 */
271 f6ad2e32 Alexander Graf
            pr->scr_act |= val;
272 f6ad2e32 Alexander Graf
            break;
273 f6ad2e32 Alexander Graf
        case PORT_CMD_ISSUE:
274 f6ad2e32 Alexander Graf
            pr->cmd_issue |= val;
275 f6ad2e32 Alexander Graf
            check_cmd(s, port);
276 f6ad2e32 Alexander Graf
            break;
277 f6ad2e32 Alexander Graf
        default:
278 f6ad2e32 Alexander Graf
            break;
279 f6ad2e32 Alexander Graf
    }
280 f6ad2e32 Alexander Graf
}
281 f6ad2e32 Alexander Graf
282 a8170e5e Avi Kivity
static uint64_t ahci_mem_read(void *opaque, hwaddr addr,
283 67e576c2 Avi Kivity
                              unsigned size)
284 f6ad2e32 Alexander Graf
{
285 67e576c2 Avi Kivity
    AHCIState *s = opaque;
286 f6ad2e32 Alexander Graf
    uint32_t val = 0;
287 f6ad2e32 Alexander Graf
288 f6ad2e32 Alexander Graf
    if (addr < AHCI_GENERIC_HOST_CONTROL_REGS_MAX_ADDR) {
289 f6ad2e32 Alexander Graf
        switch (addr) {
290 f6ad2e32 Alexander Graf
        case HOST_CAP:
291 f6ad2e32 Alexander Graf
            val = s->control_regs.cap;
292 f6ad2e32 Alexander Graf
            break;
293 f6ad2e32 Alexander Graf
        case HOST_CTL:
294 f6ad2e32 Alexander Graf
            val = s->control_regs.ghc;
295 f6ad2e32 Alexander Graf
            break;
296 f6ad2e32 Alexander Graf
        case HOST_IRQ_STAT:
297 f6ad2e32 Alexander Graf
            val = s->control_regs.irqstatus;
298 f6ad2e32 Alexander Graf
            break;
299 f6ad2e32 Alexander Graf
        case HOST_PORTS_IMPL:
300 f6ad2e32 Alexander Graf
            val = s->control_regs.impl;
301 f6ad2e32 Alexander Graf
            break;
302 f6ad2e32 Alexander Graf
        case HOST_VERSION:
303 f6ad2e32 Alexander Graf
            val = s->control_regs.version;
304 f6ad2e32 Alexander Graf
            break;
305 f6ad2e32 Alexander Graf
        }
306 f6ad2e32 Alexander Graf
307 f6ad2e32 Alexander Graf
        DPRINTF(-1, "(addr 0x%08X), val 0x%08X\n", (unsigned) addr, val);
308 f6ad2e32 Alexander Graf
    } else if ((addr >= AHCI_PORT_REGS_START_ADDR) &&
309 2c4b9d0e Alexander Graf
               (addr < (AHCI_PORT_REGS_START_ADDR +
310 2c4b9d0e Alexander Graf
                (s->ports * AHCI_PORT_ADDR_OFFSET_LEN)))) {
311 f6ad2e32 Alexander Graf
        val = ahci_port_read(s, (addr - AHCI_PORT_REGS_START_ADDR) >> 7,
312 f6ad2e32 Alexander Graf
                             addr & AHCI_PORT_ADDR_OFFSET_MASK);
313 f6ad2e32 Alexander Graf
    }
314 f6ad2e32 Alexander Graf
315 f6ad2e32 Alexander Graf
    return val;
316 f6ad2e32 Alexander Graf
}
317 f6ad2e32 Alexander Graf
318 f6ad2e32 Alexander Graf
319 f6ad2e32 Alexander Graf
320 a8170e5e Avi Kivity
static void ahci_mem_write(void *opaque, hwaddr addr,
321 67e576c2 Avi Kivity
                           uint64_t val, unsigned size)
322 f6ad2e32 Alexander Graf
{
323 67e576c2 Avi Kivity
    AHCIState *s = opaque;
324 f6ad2e32 Alexander Graf
325 f6ad2e32 Alexander Graf
    /* Only aligned reads are allowed on AHCI */
326 f6ad2e32 Alexander Graf
    if (addr & 3) {
327 f6ad2e32 Alexander Graf
        fprintf(stderr, "ahci: Mis-aligned write to addr 0x"
328 f6ad2e32 Alexander Graf
                TARGET_FMT_plx "\n", addr);
329 f6ad2e32 Alexander Graf
        return;
330 f6ad2e32 Alexander Graf
    }
331 f6ad2e32 Alexander Graf
332 f6ad2e32 Alexander Graf
    if (addr < AHCI_GENERIC_HOST_CONTROL_REGS_MAX_ADDR) {
333 3899edf7 Max Filippov
        DPRINTF(-1, "(addr 0x%08X), val 0x%08"PRIX64"\n", (unsigned) addr, val);
334 f6ad2e32 Alexander Graf
335 f6ad2e32 Alexander Graf
        switch (addr) {
336 f6ad2e32 Alexander Graf
            case HOST_CAP: /* R/WO, RO */
337 f6ad2e32 Alexander Graf
                /* FIXME handle R/WO */
338 f6ad2e32 Alexander Graf
                break;
339 f6ad2e32 Alexander Graf
            case HOST_CTL: /* R/W */
340 f6ad2e32 Alexander Graf
                if (val & HOST_CTL_RESET) {
341 f6ad2e32 Alexander Graf
                    DPRINTF(-1, "HBA Reset\n");
342 8ab60a07 Jan Kiszka
                    ahci_reset(s);
343 f6ad2e32 Alexander Graf
                } else {
344 f6ad2e32 Alexander Graf
                    s->control_regs.ghc = (val & 0x3) | HOST_CTL_AHCI_EN;
345 f6ad2e32 Alexander Graf
                    ahci_check_irq(s);
346 f6ad2e32 Alexander Graf
                }
347 f6ad2e32 Alexander Graf
                break;
348 f6ad2e32 Alexander Graf
            case HOST_IRQ_STAT: /* R/WC, RO */
349 f6ad2e32 Alexander Graf
                s->control_regs.irqstatus &= ~val;
350 f6ad2e32 Alexander Graf
                ahci_check_irq(s);
351 f6ad2e32 Alexander Graf
                break;
352 f6ad2e32 Alexander Graf
            case HOST_PORTS_IMPL: /* R/WO, RO */
353 f6ad2e32 Alexander Graf
                /* FIXME handle R/WO */
354 f6ad2e32 Alexander Graf
                break;
355 f6ad2e32 Alexander Graf
            case HOST_VERSION: /* RO */
356 f6ad2e32 Alexander Graf
                /* FIXME report write? */
357 f6ad2e32 Alexander Graf
                break;
358 f6ad2e32 Alexander Graf
            default:
359 f6ad2e32 Alexander Graf
                DPRINTF(-1, "write to unknown register 0x%x\n", (unsigned)addr);
360 f6ad2e32 Alexander Graf
        }
361 f6ad2e32 Alexander Graf
    } else if ((addr >= AHCI_PORT_REGS_START_ADDR) &&
362 2c4b9d0e Alexander Graf
               (addr < (AHCI_PORT_REGS_START_ADDR +
363 2c4b9d0e Alexander Graf
                (s->ports * AHCI_PORT_ADDR_OFFSET_LEN)))) {
364 f6ad2e32 Alexander Graf
        ahci_port_write(s, (addr - AHCI_PORT_REGS_START_ADDR) >> 7,
365 f6ad2e32 Alexander Graf
                        addr & AHCI_PORT_ADDR_OFFSET_MASK, val);
366 f6ad2e32 Alexander Graf
    }
367 f6ad2e32 Alexander Graf
368 f6ad2e32 Alexander Graf
}
369 f6ad2e32 Alexander Graf
370 a348f108 Stefan Weil
static const MemoryRegionOps ahci_mem_ops = {
371 67e576c2 Avi Kivity
    .read = ahci_mem_read,
372 67e576c2 Avi Kivity
    .write = ahci_mem_write,
373 67e576c2 Avi Kivity
    .endianness = DEVICE_LITTLE_ENDIAN,
374 f6ad2e32 Alexander Graf
};
375 f6ad2e32 Alexander Graf
376 a8170e5e Avi Kivity
static uint64_t ahci_idp_read(void *opaque, hwaddr addr,
377 465f1ab1 Daniel Verkamp
                              unsigned size)
378 465f1ab1 Daniel Verkamp
{
379 465f1ab1 Daniel Verkamp
    AHCIState *s = opaque;
380 465f1ab1 Daniel Verkamp
381 465f1ab1 Daniel Verkamp
    if (addr == s->idp_offset) {
382 465f1ab1 Daniel Verkamp
        /* index register */
383 465f1ab1 Daniel Verkamp
        return s->idp_index;
384 465f1ab1 Daniel Verkamp
    } else if (addr == s->idp_offset + 4) {
385 465f1ab1 Daniel Verkamp
        /* data register - do memory read at location selected by index */
386 465f1ab1 Daniel Verkamp
        return ahci_mem_read(opaque, s->idp_index, size);
387 465f1ab1 Daniel Verkamp
    } else {
388 465f1ab1 Daniel Verkamp
        return 0;
389 465f1ab1 Daniel Verkamp
    }
390 465f1ab1 Daniel Verkamp
}
391 465f1ab1 Daniel Verkamp
392 a8170e5e Avi Kivity
static void ahci_idp_write(void *opaque, hwaddr addr,
393 465f1ab1 Daniel Verkamp
                           uint64_t val, unsigned size)
394 465f1ab1 Daniel Verkamp
{
395 465f1ab1 Daniel Verkamp
    AHCIState *s = opaque;
396 465f1ab1 Daniel Verkamp
397 465f1ab1 Daniel Verkamp
    if (addr == s->idp_offset) {
398 465f1ab1 Daniel Verkamp
        /* index register - mask off reserved bits */
399 465f1ab1 Daniel Verkamp
        s->idp_index = (uint32_t)val & ((AHCI_MEM_BAR_SIZE - 1) & ~3);
400 465f1ab1 Daniel Verkamp
    } else if (addr == s->idp_offset + 4) {
401 465f1ab1 Daniel Verkamp
        /* data register - do memory write at location selected by index */
402 465f1ab1 Daniel Verkamp
        ahci_mem_write(opaque, s->idp_index, val, size);
403 465f1ab1 Daniel Verkamp
    }
404 465f1ab1 Daniel Verkamp
}
405 465f1ab1 Daniel Verkamp
406 a348f108 Stefan Weil
static const MemoryRegionOps ahci_idp_ops = {
407 465f1ab1 Daniel Verkamp
    .read = ahci_idp_read,
408 465f1ab1 Daniel Verkamp
    .write = ahci_idp_write,
409 465f1ab1 Daniel Verkamp
    .endianness = DEVICE_LITTLE_ENDIAN,
410 465f1ab1 Daniel Verkamp
};
411 465f1ab1 Daniel Verkamp
412 465f1ab1 Daniel Verkamp
413 f6ad2e32 Alexander Graf
static void ahci_reg_init(AHCIState *s)
414 f6ad2e32 Alexander Graf
{
415 f6ad2e32 Alexander Graf
    int i;
416 f6ad2e32 Alexander Graf
417 2c4b9d0e Alexander Graf
    s->control_regs.cap = (s->ports - 1) |
418 f6ad2e32 Alexander Graf
                          (AHCI_NUM_COMMAND_SLOTS << 8) |
419 f6ad2e32 Alexander Graf
                          (AHCI_SUPPORTED_SPEED_GEN1 << AHCI_SUPPORTED_SPEED) |
420 f6ad2e32 Alexander Graf
                          HOST_CAP_NCQ | HOST_CAP_AHCI;
421 f6ad2e32 Alexander Graf
422 2c4b9d0e Alexander Graf
    s->control_regs.impl = (1 << s->ports) - 1;
423 f6ad2e32 Alexander Graf
424 f6ad2e32 Alexander Graf
    s->control_regs.version = AHCI_VERSION_1_0;
425 f6ad2e32 Alexander Graf
426 2c4b9d0e Alexander Graf
    for (i = 0; i < s->ports; i++) {
427 f6ad2e32 Alexander Graf
        s->dev[i].port_state = STATE_RUN;
428 f6ad2e32 Alexander Graf
    }
429 f6ad2e32 Alexander Graf
}
430 f6ad2e32 Alexander Graf
431 f6ad2e32 Alexander Graf
static void check_cmd(AHCIState *s, int port)
432 f6ad2e32 Alexander Graf
{
433 f6ad2e32 Alexander Graf
    AHCIPortRegs *pr = &s->dev[port].port_regs;
434 f6ad2e32 Alexander Graf
    int slot;
435 f6ad2e32 Alexander Graf
436 f6ad2e32 Alexander Graf
    if ((pr->cmd & PORT_CMD_START) && pr->cmd_issue) {
437 f6ad2e32 Alexander Graf
        for (slot = 0; (slot < 32) && pr->cmd_issue; slot++) {
438 f6ad2e32 Alexander Graf
            if ((pr->cmd_issue & (1 << slot)) &&
439 f6ad2e32 Alexander Graf
                !handle_cmd(s, port, slot)) {
440 f6ad2e32 Alexander Graf
                pr->cmd_issue &= ~(1 << slot);
441 f6ad2e32 Alexander Graf
            }
442 f6ad2e32 Alexander Graf
        }
443 f6ad2e32 Alexander Graf
    }
444 f6ad2e32 Alexander Graf
}
445 f6ad2e32 Alexander Graf
446 f6ad2e32 Alexander Graf
static void ahci_check_cmd_bh(void *opaque)
447 f6ad2e32 Alexander Graf
{
448 f6ad2e32 Alexander Graf
    AHCIDevice *ad = opaque;
449 f6ad2e32 Alexander Graf
450 f6ad2e32 Alexander Graf
    qemu_bh_delete(ad->check_bh);
451 f6ad2e32 Alexander Graf
    ad->check_bh = NULL;
452 f6ad2e32 Alexander Graf
453 f6ad2e32 Alexander Graf
    if ((ad->busy_slot != -1) &&
454 f6ad2e32 Alexander Graf
        !(ad->port.ifs[0].status & (BUSY_STAT|DRQ_STAT))) {
455 f6ad2e32 Alexander Graf
        /* no longer busy */
456 f6ad2e32 Alexander Graf
        ad->port_regs.cmd_issue &= ~(1 << ad->busy_slot);
457 f6ad2e32 Alexander Graf
        ad->busy_slot = -1;
458 f6ad2e32 Alexander Graf
    }
459 f6ad2e32 Alexander Graf
460 f6ad2e32 Alexander Graf
    check_cmd(ad->hba, ad->port_no);
461 f6ad2e32 Alexander Graf
}
462 f6ad2e32 Alexander Graf
463 87e62065 Alexander Graf
static void ahci_init_d2h(AHCIDevice *ad)
464 87e62065 Alexander Graf
{
465 4bb9c939 Daniel Verkamp
    uint8_t init_fis[20];
466 87e62065 Alexander Graf
    IDEState *ide_state = &ad->port.ifs[0];
467 87e62065 Alexander Graf
468 87e62065 Alexander Graf
    memset(init_fis, 0, sizeof(init_fis));
469 87e62065 Alexander Graf
470 87e62065 Alexander Graf
    init_fis[4] = 1;
471 87e62065 Alexander Graf
    init_fis[12] = 1;
472 87e62065 Alexander Graf
473 87e62065 Alexander Graf
    if (ide_state->drive_kind == IDE_CD) {
474 87e62065 Alexander Graf
        init_fis[5] = ide_state->lcyl;
475 87e62065 Alexander Graf
        init_fis[6] = ide_state->hcyl;
476 87e62065 Alexander Graf
    }
477 87e62065 Alexander Graf
478 87e62065 Alexander Graf
    ahci_write_fis_d2h(ad, init_fis);
479 87e62065 Alexander Graf
}
480 87e62065 Alexander Graf
481 f6ad2e32 Alexander Graf
static void ahci_reset_port(AHCIState *s, int port)
482 f6ad2e32 Alexander Graf
{
483 f6ad2e32 Alexander Graf
    AHCIDevice *d = &s->dev[port];
484 f6ad2e32 Alexander Graf
    AHCIPortRegs *pr = &d->port_regs;
485 f6ad2e32 Alexander Graf
    IDEState *ide_state = &d->port.ifs[0];
486 f6ad2e32 Alexander Graf
    int i;
487 f6ad2e32 Alexander Graf
488 f6ad2e32 Alexander Graf
    DPRINTF(port, "reset port\n");
489 f6ad2e32 Alexander Graf
490 f6ad2e32 Alexander Graf
    ide_bus_reset(&d->port);
491 f6ad2e32 Alexander Graf
    ide_state->ncq_queues = AHCI_MAX_CMDS;
492 f6ad2e32 Alexander Graf
493 f6ad2e32 Alexander Graf
    pr->scr_stat = 0;
494 f6ad2e32 Alexander Graf
    pr->scr_err = 0;
495 f6ad2e32 Alexander Graf
    pr->scr_act = 0;
496 f6ad2e32 Alexander Graf
    d->busy_slot = -1;
497 87e62065 Alexander Graf
    d->init_d2h_sent = 0;
498 f6ad2e32 Alexander Graf
499 f6ad2e32 Alexander Graf
    ide_state = &s->dev[port].port.ifs[0];
500 f6ad2e32 Alexander Graf
    if (!ide_state->bs) {
501 f6ad2e32 Alexander Graf
        return;
502 f6ad2e32 Alexander Graf
    }
503 f6ad2e32 Alexander Graf
504 f6ad2e32 Alexander Graf
    /* reset ncq queue */
505 f6ad2e32 Alexander Graf
    for (i = 0; i < AHCI_MAX_CMDS; i++) {
506 f6ad2e32 Alexander Graf
        NCQTransferState *ncq_tfs = &s->dev[port].ncq_tfs[i];
507 f6ad2e32 Alexander Graf
        if (!ncq_tfs->used) {
508 f6ad2e32 Alexander Graf
            continue;
509 f6ad2e32 Alexander Graf
        }
510 f6ad2e32 Alexander Graf
511 f6ad2e32 Alexander Graf
        if (ncq_tfs->aiocb) {
512 f6ad2e32 Alexander Graf
            bdrv_aio_cancel(ncq_tfs->aiocb);
513 f6ad2e32 Alexander Graf
            ncq_tfs->aiocb = NULL;
514 f6ad2e32 Alexander Graf
        }
515 f6ad2e32 Alexander Graf
516 c9b308d2 Alexander Graf
        /* Maybe we just finished the request thanks to bdrv_aio_cancel() */
517 c9b308d2 Alexander Graf
        if (!ncq_tfs->used) {
518 c9b308d2 Alexander Graf
            continue;
519 c9b308d2 Alexander Graf
        }
520 c9b308d2 Alexander Graf
521 f6ad2e32 Alexander Graf
        qemu_sglist_destroy(&ncq_tfs->sglist);
522 f6ad2e32 Alexander Graf
        ncq_tfs->used = 0;
523 f6ad2e32 Alexander Graf
    }
524 f6ad2e32 Alexander Graf
525 f6ad2e32 Alexander Graf
    s->dev[port].port_state = STATE_RUN;
526 f6ad2e32 Alexander Graf
    if (!ide_state->bs) {
527 f6ad2e32 Alexander Graf
        s->dev[port].port_regs.sig = 0;
528 cdfe17df Blue Swirl
        ide_state->status = SEEK_STAT | WRERR_STAT;
529 f6ad2e32 Alexander Graf
    } else if (ide_state->drive_kind == IDE_CD) {
530 f6ad2e32 Alexander Graf
        s->dev[port].port_regs.sig = SATA_SIGNATURE_CDROM;
531 f6ad2e32 Alexander Graf
        ide_state->lcyl = 0x14;
532 f6ad2e32 Alexander Graf
        ide_state->hcyl = 0xeb;
533 f6ad2e32 Alexander Graf
        DPRINTF(port, "set lcyl = %d\n", ide_state->lcyl);
534 f6ad2e32 Alexander Graf
        ide_state->status = SEEK_STAT | WRERR_STAT | READY_STAT;
535 f6ad2e32 Alexander Graf
    } else {
536 f6ad2e32 Alexander Graf
        s->dev[port].port_regs.sig = SATA_SIGNATURE_DISK;
537 f6ad2e32 Alexander Graf
        ide_state->status = SEEK_STAT | WRERR_STAT;
538 f6ad2e32 Alexander Graf
    }
539 f6ad2e32 Alexander Graf
540 f6ad2e32 Alexander Graf
    ide_state->error = 1;
541 87e62065 Alexander Graf
    ahci_init_d2h(d);
542 f6ad2e32 Alexander Graf
}
543 f6ad2e32 Alexander Graf
544 f6ad2e32 Alexander Graf
static void debug_print_fis(uint8_t *fis, int cmd_len)
545 f6ad2e32 Alexander Graf
{
546 f6ad2e32 Alexander Graf
#ifdef DEBUG_AHCI
547 f6ad2e32 Alexander Graf
    int i;
548 f6ad2e32 Alexander Graf
549 f6ad2e32 Alexander Graf
    fprintf(stderr, "fis:");
550 f6ad2e32 Alexander Graf
    for (i = 0; i < cmd_len; i++) {
551 f6ad2e32 Alexander Graf
        if ((i & 0xf) == 0) {
552 f6ad2e32 Alexander Graf
            fprintf(stderr, "\n%02x:",i);
553 f6ad2e32 Alexander Graf
        }
554 f6ad2e32 Alexander Graf
        fprintf(stderr, "%02x ",fis[i]);
555 f6ad2e32 Alexander Graf
    }
556 f6ad2e32 Alexander Graf
    fprintf(stderr, "\n");
557 f6ad2e32 Alexander Graf
#endif
558 f6ad2e32 Alexander Graf
}
559 f6ad2e32 Alexander Graf
560 f6ad2e32 Alexander Graf
static void ahci_write_fis_sdb(AHCIState *s, int port, uint32_t finished)
561 f6ad2e32 Alexander Graf
{
562 f6ad2e32 Alexander Graf
    AHCIPortRegs *pr = &s->dev[port].port_regs;
563 f6ad2e32 Alexander Graf
    IDEState *ide_state;
564 f6ad2e32 Alexander Graf
    uint8_t *sdb_fis;
565 f6ad2e32 Alexander Graf
566 f6ad2e32 Alexander Graf
    if (!s->dev[port].res_fis ||
567 f6ad2e32 Alexander Graf
        !(pr->cmd & PORT_CMD_FIS_RX)) {
568 f6ad2e32 Alexander Graf
        return;
569 f6ad2e32 Alexander Graf
    }
570 f6ad2e32 Alexander Graf
571 f6ad2e32 Alexander Graf
    sdb_fis = &s->dev[port].res_fis[RES_FIS_SDBFIS];
572 f6ad2e32 Alexander Graf
    ide_state = &s->dev[port].port.ifs[0];
573 f6ad2e32 Alexander Graf
574 f6ad2e32 Alexander Graf
    /* clear memory */
575 f6ad2e32 Alexander Graf
    *(uint32_t*)sdb_fis = 0;
576 f6ad2e32 Alexander Graf
577 f6ad2e32 Alexander Graf
    /* write values */
578 f6ad2e32 Alexander Graf
    sdb_fis[0] = ide_state->error;
579 f6ad2e32 Alexander Graf
    sdb_fis[2] = ide_state->status & 0x77;
580 f6ad2e32 Alexander Graf
    s->dev[port].finished |= finished;
581 f6ad2e32 Alexander Graf
    *(uint32_t*)(sdb_fis + 4) = cpu_to_le32(s->dev[port].finished);
582 f6ad2e32 Alexander Graf
583 f6ad2e32 Alexander Graf
    ahci_trigger_irq(s, &s->dev[port], PORT_IRQ_STAT_SDBS);
584 f6ad2e32 Alexander Graf
}
585 f6ad2e32 Alexander Graf
586 f6ad2e32 Alexander Graf
static void ahci_write_fis_d2h(AHCIDevice *ad, uint8_t *cmd_fis)
587 f6ad2e32 Alexander Graf
{
588 f6ad2e32 Alexander Graf
    AHCIPortRegs *pr = &ad->port_regs;
589 f6ad2e32 Alexander Graf
    uint8_t *d2h_fis;
590 f6ad2e32 Alexander Graf
    int i;
591 10ca2943 David Gibson
    dma_addr_t cmd_len = 0x80;
592 f6ad2e32 Alexander Graf
    int cmd_mapped = 0;
593 f6ad2e32 Alexander Graf
594 f6ad2e32 Alexander Graf
    if (!ad->res_fis || !(pr->cmd & PORT_CMD_FIS_RX)) {
595 f6ad2e32 Alexander Graf
        return;
596 f6ad2e32 Alexander Graf
    }
597 f6ad2e32 Alexander Graf
598 f6ad2e32 Alexander Graf
    if (!cmd_fis) {
599 f6ad2e32 Alexander Graf
        /* map cmd_fis */
600 f6ad2e32 Alexander Graf
        uint64_t tbl_addr = le64_to_cpu(ad->cur_cmd->tbl_addr);
601 10ca2943 David Gibson
        cmd_fis = dma_memory_map(ad->hba->dma, tbl_addr, &cmd_len,
602 10ca2943 David Gibson
                                 DMA_DIRECTION_TO_DEVICE);
603 f6ad2e32 Alexander Graf
        cmd_mapped = 1;
604 f6ad2e32 Alexander Graf
    }
605 f6ad2e32 Alexander Graf
606 f6ad2e32 Alexander Graf
    d2h_fis = &ad->res_fis[RES_FIS_RFIS];
607 f6ad2e32 Alexander Graf
608 f6ad2e32 Alexander Graf
    d2h_fis[0] = 0x34;
609 f6ad2e32 Alexander Graf
    d2h_fis[1] = (ad->hba->control_regs.irqstatus ? (1 << 6) : 0);
610 f6ad2e32 Alexander Graf
    d2h_fis[2] = ad->port.ifs[0].status;
611 f6ad2e32 Alexander Graf
    d2h_fis[3] = ad->port.ifs[0].error;
612 f6ad2e32 Alexander Graf
613 f6ad2e32 Alexander Graf
    d2h_fis[4] = cmd_fis[4];
614 f6ad2e32 Alexander Graf
    d2h_fis[5] = cmd_fis[5];
615 f6ad2e32 Alexander Graf
    d2h_fis[6] = cmd_fis[6];
616 f6ad2e32 Alexander Graf
    d2h_fis[7] = cmd_fis[7];
617 f6ad2e32 Alexander Graf
    d2h_fis[8] = cmd_fis[8];
618 f6ad2e32 Alexander Graf
    d2h_fis[9] = cmd_fis[9];
619 f6ad2e32 Alexander Graf
    d2h_fis[10] = cmd_fis[10];
620 f6ad2e32 Alexander Graf
    d2h_fis[11] = cmd_fis[11];
621 f6ad2e32 Alexander Graf
    d2h_fis[12] = cmd_fis[12];
622 f6ad2e32 Alexander Graf
    d2h_fis[13] = cmd_fis[13];
623 4bb9c939 Daniel Verkamp
    for (i = 14; i < 20; i++) {
624 f6ad2e32 Alexander Graf
        d2h_fis[i] = 0;
625 f6ad2e32 Alexander Graf
    }
626 f6ad2e32 Alexander Graf
627 f6ad2e32 Alexander Graf
    if (d2h_fis[2] & ERR_STAT) {
628 f6ad2e32 Alexander Graf
        ahci_trigger_irq(ad->hba, ad, PORT_IRQ_STAT_TFES);
629 f6ad2e32 Alexander Graf
    }
630 f6ad2e32 Alexander Graf
631 f6ad2e32 Alexander Graf
    ahci_trigger_irq(ad->hba, ad, PORT_IRQ_D2H_REG_FIS);
632 f6ad2e32 Alexander Graf
633 f6ad2e32 Alexander Graf
    if (cmd_mapped) {
634 10ca2943 David Gibson
        dma_memory_unmap(ad->hba->dma, cmd_fis, cmd_len,
635 10ca2943 David Gibson
                         DMA_DIRECTION_TO_DEVICE, cmd_len);
636 f6ad2e32 Alexander Graf
    }
637 f6ad2e32 Alexander Graf
}
638 f6ad2e32 Alexander Graf
639 61f52e06 Jason Baron
static int ahci_populate_sglist(AHCIDevice *ad, QEMUSGList *sglist, int offset)
640 f6ad2e32 Alexander Graf
{
641 f6ad2e32 Alexander Graf
    AHCICmdHdr *cmd = ad->cur_cmd;
642 f6ad2e32 Alexander Graf
    uint32_t opts = le32_to_cpu(cmd->opts);
643 f6ad2e32 Alexander Graf
    uint64_t prdt_addr = le64_to_cpu(cmd->tbl_addr) + 0x80;
644 f6ad2e32 Alexander Graf
    int sglist_alloc_hint = opts >> AHCI_CMD_HDR_PRDT_LEN;
645 10ca2943 David Gibson
    dma_addr_t prdt_len = (sglist_alloc_hint * sizeof(AHCI_SG));
646 10ca2943 David Gibson
    dma_addr_t real_prdt_len = prdt_len;
647 f6ad2e32 Alexander Graf
    uint8_t *prdt;
648 f6ad2e32 Alexander Graf
    int i;
649 f6ad2e32 Alexander Graf
    int r = 0;
650 61f52e06 Jason Baron
    int sum = 0;
651 61f52e06 Jason Baron
    int off_idx = -1;
652 61f52e06 Jason Baron
    int off_pos = -1;
653 61f52e06 Jason Baron
    int tbl_entry_size;
654 f6ad2e32 Alexander Graf
655 f6ad2e32 Alexander Graf
    if (!sglist_alloc_hint) {
656 f6ad2e32 Alexander Graf
        DPRINTF(ad->port_no, "no sg list given by guest: 0x%08x\n", opts);
657 f6ad2e32 Alexander Graf
        return -1;
658 f6ad2e32 Alexander Graf
    }
659 f6ad2e32 Alexander Graf
660 f6ad2e32 Alexander Graf
    /* map PRDT */
661 10ca2943 David Gibson
    if (!(prdt = dma_memory_map(ad->hba->dma, prdt_addr, &prdt_len,
662 10ca2943 David Gibson
                                DMA_DIRECTION_TO_DEVICE))){
663 f6ad2e32 Alexander Graf
        DPRINTF(ad->port_no, "map failed\n");
664 f6ad2e32 Alexander Graf
        return -1;
665 f6ad2e32 Alexander Graf
    }
666 f6ad2e32 Alexander Graf
667 f6ad2e32 Alexander Graf
    if (prdt_len < real_prdt_len) {
668 f6ad2e32 Alexander Graf
        DPRINTF(ad->port_no, "mapped less than expected\n");
669 f6ad2e32 Alexander Graf
        r = -1;
670 f6ad2e32 Alexander Graf
        goto out;
671 f6ad2e32 Alexander Graf
    }
672 f6ad2e32 Alexander Graf
673 f6ad2e32 Alexander Graf
    /* Get entries in the PRDT, init a qemu sglist accordingly */
674 f6ad2e32 Alexander Graf
    if (sglist_alloc_hint > 0) {
675 f6ad2e32 Alexander Graf
        AHCI_SG *tbl = (AHCI_SG *)prdt;
676 61f52e06 Jason Baron
        sum = 0;
677 f6ad2e32 Alexander Graf
        for (i = 0; i < sglist_alloc_hint; i++) {
678 f6ad2e32 Alexander Graf
            /* flags_size is zero-based */
679 61f52e06 Jason Baron
            tbl_entry_size = (le32_to_cpu(tbl[i].flags_size) + 1);
680 61f52e06 Jason Baron
            if (offset <= (sum + tbl_entry_size)) {
681 61f52e06 Jason Baron
                off_idx = i;
682 61f52e06 Jason Baron
                off_pos = offset - sum;
683 61f52e06 Jason Baron
                break;
684 61f52e06 Jason Baron
            }
685 61f52e06 Jason Baron
            sum += tbl_entry_size;
686 61f52e06 Jason Baron
        }
687 61f52e06 Jason Baron
        if ((off_idx == -1) || (off_pos < 0) || (off_pos > tbl_entry_size)) {
688 61f52e06 Jason Baron
            DPRINTF(ad->port_no, "%s: Incorrect offset! "
689 61f52e06 Jason Baron
                            "off_idx: %d, off_pos: %d\n",
690 61f52e06 Jason Baron
                            __func__, off_idx, off_pos);
691 61f52e06 Jason Baron
            r = -1;
692 61f52e06 Jason Baron
            goto out;
693 61f52e06 Jason Baron
        }
694 61f52e06 Jason Baron
695 61f52e06 Jason Baron
        qemu_sglist_init(sglist, (sglist_alloc_hint - off_idx), ad->hba->dma);
696 61f52e06 Jason Baron
        qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr + off_pos),
697 61f52e06 Jason Baron
                        le32_to_cpu(tbl[off_idx].flags_size) + 1 - off_pos);
698 61f52e06 Jason Baron
699 61f52e06 Jason Baron
        for (i = off_idx + 1; i < sglist_alloc_hint; i++) {
700 61f52e06 Jason Baron
            /* flags_size is zero-based */
701 f6ad2e32 Alexander Graf
            qemu_sglist_add(sglist, le64_to_cpu(tbl[i].addr),
702 f6ad2e32 Alexander Graf
                            le32_to_cpu(tbl[i].flags_size) + 1);
703 f6ad2e32 Alexander Graf
        }
704 f6ad2e32 Alexander Graf
    }
705 f6ad2e32 Alexander Graf
706 f6ad2e32 Alexander Graf
out:
707 10ca2943 David Gibson
    dma_memory_unmap(ad->hba->dma, prdt, prdt_len,
708 10ca2943 David Gibson
                     DMA_DIRECTION_TO_DEVICE, prdt_len);
709 f6ad2e32 Alexander Graf
    return r;
710 f6ad2e32 Alexander Graf
}
711 f6ad2e32 Alexander Graf
712 f6ad2e32 Alexander Graf
static void ncq_cb(void *opaque, int ret)
713 f6ad2e32 Alexander Graf
{
714 f6ad2e32 Alexander Graf
    NCQTransferState *ncq_tfs = (NCQTransferState *)opaque;
715 f6ad2e32 Alexander Graf
    IDEState *ide_state = &ncq_tfs->drive->port.ifs[0];
716 f6ad2e32 Alexander Graf
717 f6ad2e32 Alexander Graf
    /* Clear bit for this tag in SActive */
718 f6ad2e32 Alexander Graf
    ncq_tfs->drive->port_regs.scr_act &= ~(1 << ncq_tfs->tag);
719 f6ad2e32 Alexander Graf
720 f6ad2e32 Alexander Graf
    if (ret < 0) {
721 f6ad2e32 Alexander Graf
        /* error */
722 f6ad2e32 Alexander Graf
        ide_state->error = ABRT_ERR;
723 f6ad2e32 Alexander Graf
        ide_state->status = READY_STAT | ERR_STAT;
724 f6ad2e32 Alexander Graf
        ncq_tfs->drive->port_regs.scr_err |= (1 << ncq_tfs->tag);
725 f6ad2e32 Alexander Graf
    } else {
726 f6ad2e32 Alexander Graf
        ide_state->status = READY_STAT | SEEK_STAT;
727 f6ad2e32 Alexander Graf
    }
728 f6ad2e32 Alexander Graf
729 f6ad2e32 Alexander Graf
    ahci_write_fis_sdb(ncq_tfs->drive->hba, ncq_tfs->drive->port_no,
730 f6ad2e32 Alexander Graf
                       (1 << ncq_tfs->tag));
731 f6ad2e32 Alexander Graf
732 f6ad2e32 Alexander Graf
    DPRINTF(ncq_tfs->drive->port_no, "NCQ transfer tag %d finished\n",
733 f6ad2e32 Alexander Graf
            ncq_tfs->tag);
734 f6ad2e32 Alexander Graf
735 a597e79c Christoph Hellwig
    bdrv_acct_done(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct);
736 f6ad2e32 Alexander Graf
    qemu_sglist_destroy(&ncq_tfs->sglist);
737 f6ad2e32 Alexander Graf
    ncq_tfs->used = 0;
738 f6ad2e32 Alexander Graf
}
739 f6ad2e32 Alexander Graf
740 f6ad2e32 Alexander Graf
static void process_ncq_command(AHCIState *s, int port, uint8_t *cmd_fis,
741 f6ad2e32 Alexander Graf
                                int slot)
742 f6ad2e32 Alexander Graf
{
743 f6ad2e32 Alexander Graf
    NCQFrame *ncq_fis = (NCQFrame*)cmd_fis;
744 f6ad2e32 Alexander Graf
    uint8_t tag = ncq_fis->tag >> 3;
745 f6ad2e32 Alexander Graf
    NCQTransferState *ncq_tfs = &s->dev[port].ncq_tfs[tag];
746 f6ad2e32 Alexander Graf
747 f6ad2e32 Alexander Graf
    if (ncq_tfs->used) {
748 f6ad2e32 Alexander Graf
        /* error - already in use */
749 f6ad2e32 Alexander Graf
        fprintf(stderr, "%s: tag %d already used\n", __FUNCTION__, tag);
750 f6ad2e32 Alexander Graf
        return;
751 f6ad2e32 Alexander Graf
    }
752 f6ad2e32 Alexander Graf
753 f6ad2e32 Alexander Graf
    ncq_tfs->used = 1;
754 f6ad2e32 Alexander Graf
    ncq_tfs->drive = &s->dev[port];
755 f6ad2e32 Alexander Graf
    ncq_tfs->slot = slot;
756 f6ad2e32 Alexander Graf
    ncq_tfs->lba = ((uint64_t)ncq_fis->lba5 << 40) |
757 f6ad2e32 Alexander Graf
                   ((uint64_t)ncq_fis->lba4 << 32) |
758 f6ad2e32 Alexander Graf
                   ((uint64_t)ncq_fis->lba3 << 24) |
759 f6ad2e32 Alexander Graf
                   ((uint64_t)ncq_fis->lba2 << 16) |
760 f6ad2e32 Alexander Graf
                   ((uint64_t)ncq_fis->lba1 << 8) |
761 f6ad2e32 Alexander Graf
                   (uint64_t)ncq_fis->lba0;
762 f6ad2e32 Alexander Graf
763 f6ad2e32 Alexander Graf
    /* Note: We calculate the sector count, but don't currently rely on it.
764 f6ad2e32 Alexander Graf
     * The total size of the DMA buffer tells us the transfer size instead. */
765 f6ad2e32 Alexander Graf
    ncq_tfs->sector_count = ((uint16_t)ncq_fis->sector_count_high << 8) |
766 f6ad2e32 Alexander Graf
                                ncq_fis->sector_count_low;
767 f6ad2e32 Alexander Graf
768 3899edf7 Max Filippov
    DPRINTF(port, "NCQ transfer LBA from %"PRId64" to %"PRId64", "
769 3899edf7 Max Filippov
            "drive max %"PRId64"\n",
770 f6ad2e32 Alexander Graf
            ncq_tfs->lba, ncq_tfs->lba + ncq_tfs->sector_count - 2,
771 f6ad2e32 Alexander Graf
            s->dev[port].port.ifs[0].nb_sectors - 1);
772 f6ad2e32 Alexander Graf
773 61f52e06 Jason Baron
    ahci_populate_sglist(&s->dev[port], &ncq_tfs->sglist, 0);
774 f6ad2e32 Alexander Graf
    ncq_tfs->tag = tag;
775 f6ad2e32 Alexander Graf
776 f6ad2e32 Alexander Graf
    switch(ncq_fis->command) {
777 f6ad2e32 Alexander Graf
        case READ_FPDMA_QUEUED:
778 3899edf7 Max Filippov
            DPRINTF(port, "NCQ reading %d sectors from LBA %"PRId64", "
779 3899edf7 Max Filippov
                    "tag %d\n",
780 f6ad2e32 Alexander Graf
                    ncq_tfs->sector_count-1, ncq_tfs->lba, ncq_tfs->tag);
781 f6ad2e32 Alexander Graf
782 3899edf7 Max Filippov
            DPRINTF(port, "tag %d aio read %"PRId64"\n",
783 3899edf7 Max Filippov
                    ncq_tfs->tag, ncq_tfs->lba);
784 a597e79c Christoph Hellwig
785 da221327 Paolo Bonzini
            dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
786 da221327 Paolo Bonzini
                           &ncq_tfs->sglist, BDRV_ACCT_READ);
787 f6ad2e32 Alexander Graf
            ncq_tfs->aiocb = dma_bdrv_read(ncq_tfs->drive->port.ifs[0].bs,
788 f6ad2e32 Alexander Graf
                                           &ncq_tfs->sglist, ncq_tfs->lba,
789 f6ad2e32 Alexander Graf
                                           ncq_cb, ncq_tfs);
790 f6ad2e32 Alexander Graf
            break;
791 f6ad2e32 Alexander Graf
        case WRITE_FPDMA_QUEUED:
792 3899edf7 Max Filippov
            DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n",
793 f6ad2e32 Alexander Graf
                    ncq_tfs->sector_count-1, ncq_tfs->lba, ncq_tfs->tag);
794 f6ad2e32 Alexander Graf
795 3899edf7 Max Filippov
            DPRINTF(port, "tag %d aio write %"PRId64"\n",
796 3899edf7 Max Filippov
                    ncq_tfs->tag, ncq_tfs->lba);
797 a597e79c Christoph Hellwig
798 da221327 Paolo Bonzini
            dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
799 da221327 Paolo Bonzini
                           &ncq_tfs->sglist, BDRV_ACCT_WRITE);
800 f6ad2e32 Alexander Graf
            ncq_tfs->aiocb = dma_bdrv_write(ncq_tfs->drive->port.ifs[0].bs,
801 f6ad2e32 Alexander Graf
                                            &ncq_tfs->sglist, ncq_tfs->lba,
802 f6ad2e32 Alexander Graf
                                            ncq_cb, ncq_tfs);
803 f6ad2e32 Alexander Graf
            break;
804 f6ad2e32 Alexander Graf
        default:
805 f6ad2e32 Alexander Graf
            DPRINTF(port, "error: tried to process non-NCQ command as NCQ\n");
806 f6ad2e32 Alexander Graf
            qemu_sglist_destroy(&ncq_tfs->sglist);
807 f6ad2e32 Alexander Graf
            break;
808 f6ad2e32 Alexander Graf
    }
809 f6ad2e32 Alexander Graf
}
810 f6ad2e32 Alexander Graf
811 f6ad2e32 Alexander Graf
static int handle_cmd(AHCIState *s, int port, int slot)
812 f6ad2e32 Alexander Graf
{
813 f6ad2e32 Alexander Graf
    IDEState *ide_state;
814 f6ad2e32 Alexander Graf
    uint32_t opts;
815 f6ad2e32 Alexander Graf
    uint64_t tbl_addr;
816 f6ad2e32 Alexander Graf
    AHCICmdHdr *cmd;
817 f6ad2e32 Alexander Graf
    uint8_t *cmd_fis;
818 10ca2943 David Gibson
    dma_addr_t cmd_len;
819 f6ad2e32 Alexander Graf
820 f6ad2e32 Alexander Graf
    if (s->dev[port].port.ifs[0].status & (BUSY_STAT|DRQ_STAT)) {
821 f6ad2e32 Alexander Graf
        /* Engine currently busy, try again later */
822 f6ad2e32 Alexander Graf
        DPRINTF(port, "engine busy\n");
823 f6ad2e32 Alexander Graf
        return -1;
824 f6ad2e32 Alexander Graf
    }
825 f6ad2e32 Alexander Graf
826 f6ad2e32 Alexander Graf
    cmd = &((AHCICmdHdr *)s->dev[port].lst)[slot];
827 f6ad2e32 Alexander Graf
828 f6ad2e32 Alexander Graf
    if (!s->dev[port].lst) {
829 f6ad2e32 Alexander Graf
        DPRINTF(port, "error: lst not given but cmd handled");
830 f6ad2e32 Alexander Graf
        return -1;
831 f6ad2e32 Alexander Graf
    }
832 f6ad2e32 Alexander Graf
833 f6ad2e32 Alexander Graf
    /* remember current slot handle for later */
834 f6ad2e32 Alexander Graf
    s->dev[port].cur_cmd = cmd;
835 f6ad2e32 Alexander Graf
836 f6ad2e32 Alexander Graf
    opts = le32_to_cpu(cmd->opts);
837 f6ad2e32 Alexander Graf
    tbl_addr = le64_to_cpu(cmd->tbl_addr);
838 f6ad2e32 Alexander Graf
839 f6ad2e32 Alexander Graf
    cmd_len = 0x80;
840 10ca2943 David Gibson
    cmd_fis = dma_memory_map(s->dma, tbl_addr, &cmd_len,
841 10ca2943 David Gibson
                             DMA_DIRECTION_FROM_DEVICE);
842 f6ad2e32 Alexander Graf
843 f6ad2e32 Alexander Graf
    if (!cmd_fis) {
844 f6ad2e32 Alexander Graf
        DPRINTF(port, "error: guest passed us an invalid cmd fis\n");
845 f6ad2e32 Alexander Graf
        return -1;
846 f6ad2e32 Alexander Graf
    }
847 f6ad2e32 Alexander Graf
848 f6ad2e32 Alexander Graf
    /* The device we are working for */
849 f6ad2e32 Alexander Graf
    ide_state = &s->dev[port].port.ifs[0];
850 f6ad2e32 Alexander Graf
851 f6ad2e32 Alexander Graf
    if (!ide_state->bs) {
852 f6ad2e32 Alexander Graf
        DPRINTF(port, "error: guest accessed unused port");
853 f6ad2e32 Alexander Graf
        goto out;
854 f6ad2e32 Alexander Graf
    }
855 f6ad2e32 Alexander Graf
856 f6ad2e32 Alexander Graf
    debug_print_fis(cmd_fis, 0x90);
857 f6ad2e32 Alexander Graf
    //debug_print_fis(cmd_fis, (opts & AHCI_CMD_HDR_CMD_FIS_LEN) * 4);
858 f6ad2e32 Alexander Graf
859 f6ad2e32 Alexander Graf
    switch (cmd_fis[0]) {
860 f6ad2e32 Alexander Graf
        case SATA_FIS_TYPE_REGISTER_H2D:
861 f6ad2e32 Alexander Graf
            break;
862 f6ad2e32 Alexander Graf
        default:
863 f6ad2e32 Alexander Graf
            DPRINTF(port, "unknown command cmd_fis[0]=%02x cmd_fis[1]=%02x "
864 f6ad2e32 Alexander Graf
                          "cmd_fis[2]=%02x\n", cmd_fis[0], cmd_fis[1],
865 f6ad2e32 Alexander Graf
                          cmd_fis[2]);
866 f6ad2e32 Alexander Graf
            goto out;
867 f6ad2e32 Alexander Graf
            break;
868 f6ad2e32 Alexander Graf
    }
869 f6ad2e32 Alexander Graf
870 f6ad2e32 Alexander Graf
    switch (cmd_fis[1]) {
871 f6ad2e32 Alexander Graf
        case SATA_FIS_REG_H2D_UPDATE_COMMAND_REGISTER:
872 f6ad2e32 Alexander Graf
            break;
873 f6ad2e32 Alexander Graf
        case 0:
874 f6ad2e32 Alexander Graf
            break;
875 f6ad2e32 Alexander Graf
        default:
876 f6ad2e32 Alexander Graf
            DPRINTF(port, "unknown command cmd_fis[0]=%02x cmd_fis[1]=%02x "
877 f6ad2e32 Alexander Graf
                          "cmd_fis[2]=%02x\n", cmd_fis[0], cmd_fis[1],
878 f6ad2e32 Alexander Graf
                          cmd_fis[2]);
879 f6ad2e32 Alexander Graf
            goto out;
880 f6ad2e32 Alexander Graf
            break;
881 f6ad2e32 Alexander Graf
    }
882 f6ad2e32 Alexander Graf
883 f6ad2e32 Alexander Graf
    switch (s->dev[port].port_state) {
884 f6ad2e32 Alexander Graf
        case STATE_RUN:
885 f6ad2e32 Alexander Graf
            if (cmd_fis[15] & ATA_SRST) {
886 f6ad2e32 Alexander Graf
                s->dev[port].port_state = STATE_RESET;
887 f6ad2e32 Alexander Graf
            }
888 f6ad2e32 Alexander Graf
            break;
889 f6ad2e32 Alexander Graf
        case STATE_RESET:
890 f6ad2e32 Alexander Graf
            if (!(cmd_fis[15] & ATA_SRST)) {
891 f6ad2e32 Alexander Graf
                ahci_reset_port(s, port);
892 f6ad2e32 Alexander Graf
            }
893 f6ad2e32 Alexander Graf
            break;
894 f6ad2e32 Alexander Graf
    }
895 f6ad2e32 Alexander Graf
896 f6ad2e32 Alexander Graf
    if (cmd_fis[1] == SATA_FIS_REG_H2D_UPDATE_COMMAND_REGISTER) {
897 f6ad2e32 Alexander Graf
898 f6ad2e32 Alexander Graf
        /* Check for NCQ command */
899 f6ad2e32 Alexander Graf
        if ((cmd_fis[2] == READ_FPDMA_QUEUED) ||
900 f6ad2e32 Alexander Graf
            (cmd_fis[2] == WRITE_FPDMA_QUEUED)) {
901 f6ad2e32 Alexander Graf
            process_ncq_command(s, port, cmd_fis, slot);
902 f6ad2e32 Alexander Graf
            goto out;
903 f6ad2e32 Alexander Graf
        }
904 f6ad2e32 Alexander Graf
905 f6ad2e32 Alexander Graf
        /* Decompose the FIS  */
906 f6ad2e32 Alexander Graf
        ide_state->nsector = (int64_t)((cmd_fis[13] << 8) | cmd_fis[12]);
907 f6ad2e32 Alexander Graf
        ide_state->feature = cmd_fis[3];
908 f6ad2e32 Alexander Graf
        if (!ide_state->nsector) {
909 f6ad2e32 Alexander Graf
            ide_state->nsector = 256;
910 f6ad2e32 Alexander Graf
        }
911 f6ad2e32 Alexander Graf
912 f6ad2e32 Alexander Graf
        if (ide_state->drive_kind != IDE_CD) {
913 1fddfba1 Alexander Graf
            /*
914 1fddfba1 Alexander Graf
             * We set the sector depending on the sector defined in the FIS.
915 1fddfba1 Alexander Graf
             * Unfortunately, the spec isn't exactly obvious on this one.
916 1fddfba1 Alexander Graf
             *
917 1fddfba1 Alexander Graf
             * Apparently LBA48 commands set fis bytes 10,9,8,6,5,4 to the
918 1fddfba1 Alexander Graf
             * 48 bit sector number. ATA_CMD_READ_DMA_EXT is an example for
919 1fddfba1 Alexander Graf
             * such a command.
920 1fddfba1 Alexander Graf
             *
921 1fddfba1 Alexander Graf
             * Non-LBA48 commands however use 7[lower 4 bits],6,5,4 to define a
922 1fddfba1 Alexander Graf
             * 28-bit sector number. ATA_CMD_READ_DMA is an example for such
923 1fddfba1 Alexander Graf
             * a command.
924 1fddfba1 Alexander Graf
             *
925 1fddfba1 Alexander Graf
             * Since the spec doesn't explicitly state what each field should
926 1fddfba1 Alexander Graf
             * do, I simply assume non-used fields as reserved and OR everything
927 1fddfba1 Alexander Graf
             * together, independent of the command.
928 1fddfba1 Alexander Graf
             */
929 1fddfba1 Alexander Graf
            ide_set_sector(ide_state, ((uint64_t)cmd_fis[10] << 40)
930 1fddfba1 Alexander Graf
                                    | ((uint64_t)cmd_fis[9] << 32)
931 1fddfba1 Alexander Graf
                                    /* This is used for LBA48 commands */
932 1fddfba1 Alexander Graf
                                    | ((uint64_t)cmd_fis[8] << 24)
933 1fddfba1 Alexander Graf
                                    /* This is used for non-LBA48 commands */
934 1fddfba1 Alexander Graf
                                    | ((uint64_t)(cmd_fis[7] & 0xf) << 24)
935 1fddfba1 Alexander Graf
                                    | ((uint64_t)cmd_fis[6] << 16)
936 1fddfba1 Alexander Graf
                                    | ((uint64_t)cmd_fis[5] << 8)
937 1fddfba1 Alexander Graf
                                    | cmd_fis[4]);
938 f6ad2e32 Alexander Graf
        }
939 f6ad2e32 Alexander Graf
940 f6ad2e32 Alexander Graf
        /* Copy the ACMD field (ATAPI packet, if any) from the AHCI command
941 f6ad2e32 Alexander Graf
         * table to ide_state->io_buffer
942 f6ad2e32 Alexander Graf
         */
943 f6ad2e32 Alexander Graf
        if (opts & AHCI_CMD_ATAPI) {
944 f6ad2e32 Alexander Graf
            memcpy(ide_state->io_buffer, &cmd_fis[AHCI_COMMAND_TABLE_ACMD], 0x10);
945 f6ad2e32 Alexander Graf
            ide_state->lcyl = 0x14;
946 f6ad2e32 Alexander Graf
            ide_state->hcyl = 0xeb;
947 f6ad2e32 Alexander Graf
            debug_print_fis(ide_state->io_buffer, 0x10);
948 f6ad2e32 Alexander Graf
            ide_state->feature = IDE_FEATURE_DMA;
949 f6ad2e32 Alexander Graf
            s->dev[port].done_atapi_packet = 0;
950 f6ad2e32 Alexander Graf
            /* XXX send PIO setup FIS */
951 f6ad2e32 Alexander Graf
        }
952 f6ad2e32 Alexander Graf
953 f6ad2e32 Alexander Graf
        ide_state->error = 0;
954 f6ad2e32 Alexander Graf
955 f6ad2e32 Alexander Graf
        /* Reset transferred byte counter */
956 f6ad2e32 Alexander Graf
        cmd->status = 0;
957 f6ad2e32 Alexander Graf
958 f6ad2e32 Alexander Graf
        /* We're ready to process the command in FIS byte 2. */
959 f6ad2e32 Alexander Graf
        ide_exec_cmd(&s->dev[port].port, cmd_fis[2]);
960 f6ad2e32 Alexander Graf
961 f6ad2e32 Alexander Graf
        if (s->dev[port].port.ifs[0].status & READY_STAT) {
962 f6ad2e32 Alexander Graf
            ahci_write_fis_d2h(&s->dev[port], cmd_fis);
963 f6ad2e32 Alexander Graf
        }
964 f6ad2e32 Alexander Graf
    }
965 f6ad2e32 Alexander Graf
966 f6ad2e32 Alexander Graf
out:
967 10ca2943 David Gibson
    dma_memory_unmap(s->dma, cmd_fis, cmd_len, DMA_DIRECTION_FROM_DEVICE,
968 10ca2943 David Gibson
                     cmd_len);
969 f6ad2e32 Alexander Graf
970 f6ad2e32 Alexander Graf
    if (s->dev[port].port.ifs[0].status & (BUSY_STAT|DRQ_STAT)) {
971 f6ad2e32 Alexander Graf
        /* async command, complete later */
972 f6ad2e32 Alexander Graf
        s->dev[port].busy_slot = slot;
973 f6ad2e32 Alexander Graf
        return -1;
974 f6ad2e32 Alexander Graf
    }
975 f6ad2e32 Alexander Graf
976 f6ad2e32 Alexander Graf
    /* done handling the command */
977 f6ad2e32 Alexander Graf
    return 0;
978 f6ad2e32 Alexander Graf
}
979 f6ad2e32 Alexander Graf
980 f6ad2e32 Alexander Graf
/* DMA dev <-> ram */
981 f6ad2e32 Alexander Graf
static int ahci_start_transfer(IDEDMA *dma)
982 f6ad2e32 Alexander Graf
{
983 f6ad2e32 Alexander Graf
    AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
984 f6ad2e32 Alexander Graf
    IDEState *s = &ad->port.ifs[0];
985 f6ad2e32 Alexander Graf
    uint32_t size = (uint32_t)(s->data_end - s->data_ptr);
986 f6ad2e32 Alexander Graf
    /* write == ram -> device */
987 f6ad2e32 Alexander Graf
    uint32_t opts = le32_to_cpu(ad->cur_cmd->opts);
988 f6ad2e32 Alexander Graf
    int is_write = opts & AHCI_CMD_WRITE;
989 f6ad2e32 Alexander Graf
    int is_atapi = opts & AHCI_CMD_ATAPI;
990 f6ad2e32 Alexander Graf
    int has_sglist = 0;
991 f6ad2e32 Alexander Graf
992 f6ad2e32 Alexander Graf
    if (is_atapi && !ad->done_atapi_packet) {
993 f6ad2e32 Alexander Graf
        /* already prepopulated iobuffer */
994 f6ad2e32 Alexander Graf
        ad->done_atapi_packet = 1;
995 f6ad2e32 Alexander Graf
        goto out;
996 f6ad2e32 Alexander Graf
    }
997 f6ad2e32 Alexander Graf
998 61f52e06 Jason Baron
    if (!ahci_populate_sglist(ad, &s->sg, 0)) {
999 f6ad2e32 Alexander Graf
        has_sglist = 1;
1000 f6ad2e32 Alexander Graf
    }
1001 f6ad2e32 Alexander Graf
1002 f6ad2e32 Alexander Graf
    DPRINTF(ad->port_no, "%sing %d bytes on %s w/%s sglist\n",
1003 f6ad2e32 Alexander Graf
            is_write ? "writ" : "read", size, is_atapi ? "atapi" : "ata",
1004 f6ad2e32 Alexander Graf
            has_sglist ? "" : "o");
1005 f6ad2e32 Alexander Graf
1006 da221327 Paolo Bonzini
    if (has_sglist && size) {
1007 da221327 Paolo Bonzini
        if (is_write) {
1008 da221327 Paolo Bonzini
            dma_buf_write(s->data_ptr, size, &s->sg);
1009 da221327 Paolo Bonzini
        } else {
1010 da221327 Paolo Bonzini
            dma_buf_read(s->data_ptr, size, &s->sg);
1011 da221327 Paolo Bonzini
        }
1012 f6ad2e32 Alexander Graf
    }
1013 f6ad2e32 Alexander Graf
1014 f6ad2e32 Alexander Graf
    /* update number of transferred bytes */
1015 f6ad2e32 Alexander Graf
    ad->cur_cmd->status = cpu_to_le32(le32_to_cpu(ad->cur_cmd->status) + size);
1016 f6ad2e32 Alexander Graf
1017 f6ad2e32 Alexander Graf
out:
1018 f6ad2e32 Alexander Graf
    /* declare that we processed everything */
1019 f6ad2e32 Alexander Graf
    s->data_ptr = s->data_end;
1020 f6ad2e32 Alexander Graf
1021 f6ad2e32 Alexander Graf
    if (has_sglist) {
1022 f6ad2e32 Alexander Graf
        qemu_sglist_destroy(&s->sg);
1023 f6ad2e32 Alexander Graf
    }
1024 f6ad2e32 Alexander Graf
1025 f6ad2e32 Alexander Graf
    s->end_transfer_func(s);
1026 f6ad2e32 Alexander Graf
1027 f6ad2e32 Alexander Graf
    if (!(s->status & DRQ_STAT)) {
1028 f6ad2e32 Alexander Graf
        /* done with DMA */
1029 f6ad2e32 Alexander Graf
        ahci_trigger_irq(ad->hba, ad, PORT_IRQ_STAT_DSS);
1030 f6ad2e32 Alexander Graf
    }
1031 f6ad2e32 Alexander Graf
1032 f6ad2e32 Alexander Graf
    return 0;
1033 f6ad2e32 Alexander Graf
}
1034 f6ad2e32 Alexander Graf
1035 f6ad2e32 Alexander Graf
static void ahci_start_dma(IDEDMA *dma, IDEState *s,
1036 f6ad2e32 Alexander Graf
                           BlockDriverCompletionFunc *dma_cb)
1037 f6ad2e32 Alexander Graf
{
1038 f6ad2e32 Alexander Graf
    AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
1039 f6ad2e32 Alexander Graf
1040 f6ad2e32 Alexander Graf
    DPRINTF(ad->port_no, "\n");
1041 f6ad2e32 Alexander Graf
    ad->dma_cb = dma_cb;
1042 f6ad2e32 Alexander Graf
    ad->dma_status |= BM_STATUS_DMAING;
1043 61f52e06 Jason Baron
    s->io_buffer_offset = 0;
1044 f6ad2e32 Alexander Graf
    dma_cb(s, 0);
1045 f6ad2e32 Alexander Graf
}
1046 f6ad2e32 Alexander Graf
1047 f6ad2e32 Alexander Graf
static int ahci_dma_prepare_buf(IDEDMA *dma, int is_write)
1048 f6ad2e32 Alexander Graf
{
1049 f6ad2e32 Alexander Graf
    AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
1050 f6ad2e32 Alexander Graf
    IDEState *s = &ad->port.ifs[0];
1051 f6ad2e32 Alexander Graf
1052 61f52e06 Jason Baron
    ahci_populate_sglist(ad, &s->sg, 0);
1053 da221327 Paolo Bonzini
    s->io_buffer_size = s->sg.size;
1054 f6ad2e32 Alexander Graf
1055 f6ad2e32 Alexander Graf
    DPRINTF(ad->port_no, "len=%#x\n", s->io_buffer_size);
1056 f6ad2e32 Alexander Graf
    return s->io_buffer_size != 0;
1057 f6ad2e32 Alexander Graf
}
1058 f6ad2e32 Alexander Graf
1059 f6ad2e32 Alexander Graf
static int ahci_dma_rw_buf(IDEDMA *dma, int is_write)
1060 f6ad2e32 Alexander Graf
{
1061 f6ad2e32 Alexander Graf
    AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
1062 f6ad2e32 Alexander Graf
    IDEState *s = &ad->port.ifs[0];
1063 f6ad2e32 Alexander Graf
    uint8_t *p = s->io_buffer + s->io_buffer_index;
1064 f6ad2e32 Alexander Graf
    int l = s->io_buffer_size - s->io_buffer_index;
1065 f6ad2e32 Alexander Graf
1066 61f52e06 Jason Baron
    if (ahci_populate_sglist(ad, &s->sg, s->io_buffer_offset)) {
1067 f6ad2e32 Alexander Graf
        return 0;
1068 f6ad2e32 Alexander Graf
    }
1069 f6ad2e32 Alexander Graf
1070 f6ad2e32 Alexander Graf
    if (is_write) {
1071 da221327 Paolo Bonzini
        dma_buf_read(p, l, &s->sg);
1072 f6ad2e32 Alexander Graf
    } else {
1073 da221327 Paolo Bonzini
        dma_buf_write(p, l, &s->sg);
1074 f6ad2e32 Alexander Graf
    }
1075 f6ad2e32 Alexander Graf
1076 ea8d82a1 Jason Baron
    /* free sglist that was created in ahci_populate_sglist() */
1077 ea8d82a1 Jason Baron
    qemu_sglist_destroy(&s->sg);
1078 ea8d82a1 Jason Baron
1079 f6ad2e32 Alexander Graf
    /* update number of transferred bytes */
1080 f6ad2e32 Alexander Graf
    ad->cur_cmd->status = cpu_to_le32(le32_to_cpu(ad->cur_cmd->status) + l);
1081 f6ad2e32 Alexander Graf
    s->io_buffer_index += l;
1082 61f52e06 Jason Baron
    s->io_buffer_offset += l;
1083 f6ad2e32 Alexander Graf
1084 f6ad2e32 Alexander Graf
    DPRINTF(ad->port_no, "len=%#x\n", l);
1085 f6ad2e32 Alexander Graf
1086 f6ad2e32 Alexander Graf
    return 1;
1087 f6ad2e32 Alexander Graf
}
1088 f6ad2e32 Alexander Graf
1089 f6ad2e32 Alexander Graf
static int ahci_dma_set_unit(IDEDMA *dma, int unit)
1090 f6ad2e32 Alexander Graf
{
1091 f6ad2e32 Alexander Graf
    /* only a single unit per link */
1092 f6ad2e32 Alexander Graf
    return 0;
1093 f6ad2e32 Alexander Graf
}
1094 f6ad2e32 Alexander Graf
1095 f6ad2e32 Alexander Graf
static int ahci_dma_add_status(IDEDMA *dma, int status)
1096 f6ad2e32 Alexander Graf
{
1097 f6ad2e32 Alexander Graf
    AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
1098 f6ad2e32 Alexander Graf
    ad->dma_status |= status;
1099 f6ad2e32 Alexander Graf
    DPRINTF(ad->port_no, "set status: %x\n", status);
1100 f6ad2e32 Alexander Graf
1101 f6ad2e32 Alexander Graf
    if (status & BM_STATUS_INT) {
1102 f6ad2e32 Alexander Graf
        ahci_trigger_irq(ad->hba, ad, PORT_IRQ_STAT_DSS);
1103 f6ad2e32 Alexander Graf
    }
1104 f6ad2e32 Alexander Graf
1105 f6ad2e32 Alexander Graf
    return 0;
1106 f6ad2e32 Alexander Graf
}
1107 f6ad2e32 Alexander Graf
1108 f6ad2e32 Alexander Graf
static int ahci_dma_set_inactive(IDEDMA *dma)
1109 f6ad2e32 Alexander Graf
{
1110 f6ad2e32 Alexander Graf
    AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
1111 f6ad2e32 Alexander Graf
1112 f6ad2e32 Alexander Graf
    DPRINTF(ad->port_no, "dma done\n");
1113 f6ad2e32 Alexander Graf
1114 f6ad2e32 Alexander Graf
    /* update d2h status */
1115 f6ad2e32 Alexander Graf
    ahci_write_fis_d2h(ad, NULL);
1116 f6ad2e32 Alexander Graf
1117 f6ad2e32 Alexander Graf
    ad->dma_cb = NULL;
1118 f6ad2e32 Alexander Graf
1119 4d29b50a Jan Kiszka
    if (!ad->check_bh) {
1120 4d29b50a Jan Kiszka
        /* maybe we still have something to process, check later */
1121 4d29b50a Jan Kiszka
        ad->check_bh = qemu_bh_new(ahci_check_cmd_bh, ad);
1122 4d29b50a Jan Kiszka
        qemu_bh_schedule(ad->check_bh);
1123 4d29b50a Jan Kiszka
    }
1124 f6ad2e32 Alexander Graf
1125 f6ad2e32 Alexander Graf
    return 0;
1126 f6ad2e32 Alexander Graf
}
1127 f6ad2e32 Alexander Graf
1128 f6ad2e32 Alexander Graf
static void ahci_irq_set(void *opaque, int n, int level)
1129 f6ad2e32 Alexander Graf
{
1130 f6ad2e32 Alexander Graf
}
1131 f6ad2e32 Alexander Graf
1132 1dfb4dd9 Luiz Capitulino
static void ahci_dma_restart_cb(void *opaque, int running, RunState state)
1133 f6ad2e32 Alexander Graf
{
1134 f6ad2e32 Alexander Graf
}
1135 f6ad2e32 Alexander Graf
1136 f6ad2e32 Alexander Graf
static int ahci_dma_reset(IDEDMA *dma)
1137 f6ad2e32 Alexander Graf
{
1138 f6ad2e32 Alexander Graf
    return 0;
1139 f6ad2e32 Alexander Graf
}
1140 f6ad2e32 Alexander Graf
1141 f6ad2e32 Alexander Graf
static const IDEDMAOps ahci_dma_ops = {
1142 f6ad2e32 Alexander Graf
    .start_dma = ahci_start_dma,
1143 f6ad2e32 Alexander Graf
    .start_transfer = ahci_start_transfer,
1144 f6ad2e32 Alexander Graf
    .prepare_buf = ahci_dma_prepare_buf,
1145 f6ad2e32 Alexander Graf
    .rw_buf = ahci_dma_rw_buf,
1146 f6ad2e32 Alexander Graf
    .set_unit = ahci_dma_set_unit,
1147 f6ad2e32 Alexander Graf
    .add_status = ahci_dma_add_status,
1148 f6ad2e32 Alexander Graf
    .set_inactive = ahci_dma_set_inactive,
1149 f6ad2e32 Alexander Graf
    .restart_cb = ahci_dma_restart_cb,
1150 f6ad2e32 Alexander Graf
    .reset = ahci_dma_reset,
1151 f6ad2e32 Alexander Graf
};
1152 f6ad2e32 Alexander Graf
1153 10ca2943 David Gibson
void ahci_init(AHCIState *s, DeviceState *qdev, DMAContext *dma, int ports)
1154 f6ad2e32 Alexander Graf
{
1155 f6ad2e32 Alexander Graf
    qemu_irq *irqs;
1156 f6ad2e32 Alexander Graf
    int i;
1157 f6ad2e32 Alexander Graf
1158 10ca2943 David Gibson
    s->dma = dma;
1159 2c4b9d0e Alexander Graf
    s->ports = ports;
1160 7267c094 Anthony Liguori
    s->dev = g_malloc0(sizeof(AHCIDevice) * ports);
1161 f6ad2e32 Alexander Graf
    ahci_reg_init(s);
1162 67e576c2 Avi Kivity
    /* XXX BAR size should be 1k, but that breaks, so bump it to 4k for now */
1163 465f1ab1 Daniel Verkamp
    memory_region_init_io(&s->mem, &ahci_mem_ops, s, "ahci", AHCI_MEM_BAR_SIZE);
1164 465f1ab1 Daniel Verkamp
    memory_region_init_io(&s->idp, &ahci_idp_ops, s, "ahci-idp", 32);
1165 465f1ab1 Daniel Verkamp
1166 2c4b9d0e Alexander Graf
    irqs = qemu_allocate_irqs(ahci_irq_set, s, s->ports);
1167 f6ad2e32 Alexander Graf
1168 2c4b9d0e Alexander Graf
    for (i = 0; i < s->ports; i++) {
1169 f6ad2e32 Alexander Graf
        AHCIDevice *ad = &s->dev[i];
1170 f6ad2e32 Alexander Graf
1171 f6ad2e32 Alexander Graf
        ide_bus_new(&ad->port, qdev, i);
1172 f6ad2e32 Alexander Graf
        ide_init2(&ad->port, irqs[i]);
1173 f6ad2e32 Alexander Graf
1174 f6ad2e32 Alexander Graf
        ad->hba = s;
1175 f6ad2e32 Alexander Graf
        ad->port_no = i;
1176 f6ad2e32 Alexander Graf
        ad->port.dma = &ad->dma;
1177 f6ad2e32 Alexander Graf
        ad->port.dma->ops = &ahci_dma_ops;
1178 f6ad2e32 Alexander Graf
    }
1179 f6ad2e32 Alexander Graf
}
1180 f6ad2e32 Alexander Graf
1181 2c4b9d0e Alexander Graf
void ahci_uninit(AHCIState *s)
1182 2c4b9d0e Alexander Graf
{
1183 67e576c2 Avi Kivity
    memory_region_destroy(&s->mem);
1184 465f1ab1 Daniel Verkamp
    memory_region_destroy(&s->idp);
1185 7267c094 Anthony Liguori
    g_free(s->dev);
1186 2c4b9d0e Alexander Graf
}
1187 2c4b9d0e Alexander Graf
1188 8ab60a07 Jan Kiszka
void ahci_reset(AHCIState *s)
1189 f6ad2e32 Alexander Graf
{
1190 a26a13da Alexander Motin
    AHCIPortRegs *pr;
1191 f6ad2e32 Alexander Graf
    int i;
1192 f6ad2e32 Alexander Graf
1193 8ab60a07 Jan Kiszka
    s->control_regs.irqstatus = 0;
1194 8ab60a07 Jan Kiszka
    s->control_regs.ghc = 0;
1195 760c3e44 Alexander Graf
1196 8ab60a07 Jan Kiszka
    for (i = 0; i < s->ports; i++) {
1197 8ab60a07 Jan Kiszka
        pr = &s->dev[i].port_regs;
1198 a26a13da Alexander Motin
        pr->irq_stat = 0;
1199 a26a13da Alexander Motin
        pr->irq_mask = 0;
1200 a26a13da Alexander Motin
        pr->scr_ctl = 0;
1201 2a4f4f34 Jason Baron
        pr->cmd = PORT_CMD_SPIN_UP | PORT_CMD_POWER_ON;
1202 8ab60a07 Jan Kiszka
        ahci_reset_port(s, i);
1203 f6ad2e32 Alexander Graf
    }
1204 f6ad2e32 Alexander Graf
}
1205 d9fa31a3 Rob Herring
1206 d9fa31a3 Rob Herring
typedef struct SysbusAHCIState {
1207 d9fa31a3 Rob Herring
    SysBusDevice busdev;
1208 d9fa31a3 Rob Herring
    AHCIState ahci;
1209 d9fa31a3 Rob Herring
    uint32_t num_ports;
1210 d9fa31a3 Rob Herring
} SysbusAHCIState;
1211 d9fa31a3 Rob Herring
1212 d9fa31a3 Rob Herring
static const VMStateDescription vmstate_sysbus_ahci = {
1213 d9fa31a3 Rob Herring
    .name = "sysbus-ahci",
1214 d9fa31a3 Rob Herring
    .unmigratable = 1,
1215 d9fa31a3 Rob Herring
};
1216 d9fa31a3 Rob Herring
1217 8ab60a07 Jan Kiszka
static void sysbus_ahci_reset(DeviceState *dev)
1218 8ab60a07 Jan Kiszka
{
1219 8ab60a07 Jan Kiszka
    SysbusAHCIState *s = DO_UPCAST(SysbusAHCIState, busdev.qdev, dev);
1220 8ab60a07 Jan Kiszka
1221 8ab60a07 Jan Kiszka
    ahci_reset(&s->ahci);
1222 8ab60a07 Jan Kiszka
}
1223 8ab60a07 Jan Kiszka
1224 d9fa31a3 Rob Herring
static int sysbus_ahci_init(SysBusDevice *dev)
1225 d9fa31a3 Rob Herring
{
1226 d9fa31a3 Rob Herring
    SysbusAHCIState *s = FROM_SYSBUS(SysbusAHCIState, dev);
1227 10ca2943 David Gibson
    ahci_init(&s->ahci, &dev->qdev, NULL, s->num_ports);
1228 d9fa31a3 Rob Herring
1229 d9fa31a3 Rob Herring
    sysbus_init_mmio(dev, &s->ahci.mem);
1230 d9fa31a3 Rob Herring
    sysbus_init_irq(dev, &s->ahci.irq);
1231 d9fa31a3 Rob Herring
    return 0;
1232 d9fa31a3 Rob Herring
}
1233 d9fa31a3 Rob Herring
1234 39bffca2 Anthony Liguori
static Property sysbus_ahci_properties[] = {
1235 39bffca2 Anthony Liguori
    DEFINE_PROP_UINT32("num-ports", SysbusAHCIState, num_ports, 1),
1236 39bffca2 Anthony Liguori
    DEFINE_PROP_END_OF_LIST(),
1237 39bffca2 Anthony Liguori
};
1238 39bffca2 Anthony Liguori
1239 999e12bb Anthony Liguori
static void sysbus_ahci_class_init(ObjectClass *klass, void *data)
1240 999e12bb Anthony Liguori
{
1241 999e12bb Anthony Liguori
    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
1242 39bffca2 Anthony Liguori
    DeviceClass *dc = DEVICE_CLASS(klass);
1243 999e12bb Anthony Liguori
1244 999e12bb Anthony Liguori
    sbc->init = sysbus_ahci_init;
1245 39bffca2 Anthony Liguori
    dc->vmsd = &vmstate_sysbus_ahci;
1246 39bffca2 Anthony Liguori
    dc->props = sysbus_ahci_properties;
1247 8ab60a07 Jan Kiszka
    dc->reset = sysbus_ahci_reset;
1248 999e12bb Anthony Liguori
}
1249 999e12bb Anthony Liguori
1250 39bffca2 Anthony Liguori
static TypeInfo sysbus_ahci_info = {
1251 39bffca2 Anthony Liguori
    .name          = "sysbus-ahci",
1252 39bffca2 Anthony Liguori
    .parent        = TYPE_SYS_BUS_DEVICE,
1253 39bffca2 Anthony Liguori
    .instance_size = sizeof(SysbusAHCIState),
1254 39bffca2 Anthony Liguori
    .class_init    = sysbus_ahci_class_init,
1255 d9fa31a3 Rob Herring
};
1256 d9fa31a3 Rob Herring
1257 83f7d43a Andreas Färber
static void sysbus_ahci_register_types(void)
1258 d9fa31a3 Rob Herring
{
1259 39bffca2 Anthony Liguori
    type_register_static(&sysbus_ahci_info);
1260 d9fa31a3 Rob Herring
}
1261 d9fa31a3 Rob Herring
1262 83f7d43a Andreas Färber
type_init(sysbus_ahci_register_types)