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 ;
|
SubDir HAIKU_TOP src add-ons kernel busses scsi ahci ;
|
||||||
|
|
||||||
|
UsePrivateHeaders drivers kernel ;
|
||||||
|
UsePrivateHeaders [ FDirName kernel arch $(TARGET_ARCH) ] ;
|
||||||
|
|
||||||
KernelAddon ahci :
|
KernelAddon ahci :
|
||||||
ahci.c
|
ahci.c
|
||||||
ahci_controller.cpp
|
ahci_controller.cpp
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
|
#include <vm.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -74,3 +75,28 @@ map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name
|
|||||||
|
|
||||||
return area;
|
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
|
#ifndef __UTIL_H
|
||||||
#define __UTIL_H
|
#define __UTIL_H
|
||||||
|
|
||||||
#include <OS.h>
|
#include <KernelExport.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
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 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);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user