added sg_memcpy to copy data into a scatter-gather table (inspired by IDE device manager)
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22351 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <KernelExport.h>
|
||||
#include <OS.h>
|
||||
#include <vm.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#ifndef __UTIL_H
|
||||
#define __UTIL_H
|
||||
|
||||
#include <OS.h>
|
||||
#include <KernelExport.h>
|
||||
|
||||
#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
|
||||
|
||||
Reference in New Issue
Block a user