1#include <barrelfish/barrelfish.h>
2#include <pci/pci.h>
3
4#include "blk_ahci.h"
5#include "../blk_debug.h"
6#include "ahci_dev.h"
7
8lvaddr_t blk_ahci_get_bar5_vaddr(struct ahci_disk* ad)
9{
10    assert(ad->bar5->vaddr != NULL);
11    return (lvaddr_t)ad->bar5->vaddr;
12}
13
14errval_t blk_ahci_init(struct device_mem* bar5, struct ahci_disk** out)
15{
16    errval_t err;
17
18    err = map_device(bar5);
19    if (err_is_fail(err)) {
20        USER_PANIC_ERR(err, "Map BAR5 failed.");
21    }
22
23    struct ahci_disk* ad = calloc(sizeof(struct ahci_disk), 1);
24    assert (ad != NULL);
25
26    ad->bar5 = bar5;
27
28    ahci_hba_initialize(&ad->controller, (void *)(bar5->vaddr));
29    BLK_DEBUG("Accessing conf regs starting at %p\n", (void *)(bar5->vaddr));
30    BLK_DEBUG("Physical address of conf regs: %p\n",  (void *)(bar5->paddr));
31
32    err = ahci_hba_init(&ad->controller);
33    if (err_is_fail(err)) {
34        USER_PANIC_ERR(err, "Init HBA failed.");
35    }
36
37    ahci_hba_irq_enable(&ad->controller);
38
39    err = blk_ahci_ports_init(ad);
40    if (err_is_fail(err)) {
41        USER_PANIC_ERR(err, "Port init failed.");
42    }
43
44    *out = ad;
45    return err;
46}
47
48
49errval_t blk_ahci_stop(struct ahci_disk* ad)
50{
51    // stop device
52    // devmem free (ad->bar5)
53    // free (ad)
54
55    return SYS_ERR_OK;
56}
57