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