diff --git a/src/add-ons/kernel/busses/scsi/ahci/Jamfile b/src/add-ons/kernel/busses/scsi/ahci/Jamfile index b63accc482..bb1822a019 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/Jamfile +++ b/src/add-ons/kernel/busses/scsi/ahci/Jamfile @@ -1,5 +1,8 @@ SubDir HAIKU_TOP src add-ons kernel busses scsi ahci ; +UsePrivateHeaders drivers kernel ; +UsePrivateHeaders [ FDirName kernel arch $(TARGET_ARCH) ] ; + KernelAddon ahci : ahci.c ahci_controller.cpp diff --git a/src/add-ons/kernel/busses/scsi/ahci/util.c b/src/add-ons/kernel/busses/scsi/ahci/util.c index f3b46cb272..66e78d64ef 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/util.c +++ b/src/add-ons/kernel/busses/scsi/ahci/util.c @@ -6,6 +6,7 @@ #include #include +#include #include @@ -74,3 +75,28 @@ map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name return area; } + + +status_t +sg_memcpy(const physical_entry *sgTable, int sgCount, const void *data, size_t dataSize) +{ + int i; + for (i = 0; i < sgCount && dataSize > 0; i++) { + size_t size = min_c(dataSize, sgTable[i].size); + addr_t address; + + if (vm_get_physical_page((addr_t)sgTable[i].address, &address, PHYSICAL_PAGE_CAN_WAIT) < B_OK) + return B_ERROR; + + TRACE("sg_memcpy phyAddr %p, addr %p, size %lu\n", sgTable[i].address, (void *)address, size); + + memcpy((void *)address, data, size); + vm_put_physical_page(address); + + data = (char *)data + size; + dataSize -= size; + } + if (dataSize != 0) + return B_ERROR; + return B_OK; +} diff --git a/src/add-ons/kernel/busses/scsi/ahci/util.h b/src/add-ons/kernel/busses/scsi/ahci/util.h index e06729915e..094836f8a1 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/util.h +++ b/src/add-ons/kernel/busses/scsi/ahci/util.h @@ -5,7 +5,7 @@ #ifndef __UTIL_H #define __UTIL_H -#include +#include #ifdef __cplusplus extern "C" { @@ -14,6 +14,8 @@ extern "C" { area_id alloc_mem(void **virt, void **phy, size_t size, uint32 protection, const char *name); area_id map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name); +status_t sg_memcpy(const physical_entry *sgTable, int sgCount, const void *data, size_t dataSize); + #ifdef __cplusplus } #endif