Statistics
| Branch: | Revision:

root / hw / ide / ahci.c @ 7267c094

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