From 512a7c282c3aee4ffe39cf68d666b1980595c14d Mon Sep 17 00:00:00 2001
From: foreman
Date: Tue, 13 Oct 2015 16:47:28 -0400
Subject: [PATCH] P4 to Git Change 1199371 by lmoriche@lmoriche_opencl_dev on
2015/10/13 16:29:28
SWDEV-78467 - Add the LiquidFlashFile implementation (except for readBlocks)
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/build/Makefile.api#121 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_lqdflash_amd.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_lqdflash_amd.h#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/khronos/headers/opencl2.0/CL/cl_ext.h#19 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/object.hpp#16 edit
[ROCm/clr commit: d53303025fb4028b44c3948492b9f8f53021a0fa]
---
.../api/opencl/amdocl/cl_lqdflash_amd.cpp | 134 +++++++++++++++++-
.../api/opencl/amdocl/cl_lqdflash_amd.h | 2 +-
.../khronos/headers/opencl2.0/CL/cl_ext.h | 5 +-
3 files changed, 132 insertions(+), 9 deletions(-)
diff --git a/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.cpp b/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.cpp
index acd3bd88f2..cc13f6091e 100644
--- a/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.cpp
+++ b/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.cpp
@@ -3,9 +3,108 @@
//
#include "cl_common.hpp"
+#include
+
+#include "platform/object.hpp"
#include "cl_lqdflash_amd.h"
+#if defined __linux__
+typedef wchar_t char_t;
+#endif // __linux__
+
+#if defined _WIN32
+//#define WITH_LIQUID_FLASH 1
+#endif // _WIN32
+
+#if defined WITH_LIQUID_FLASH
+#include "lf.h"
+#endif // WITH_LIQUID_FLASH
+
+
+namespace amd {
+
+class LiquidFlashFile : public RuntimeObject
+{
+private:
+ const wchar_t* name_;
+ cl_file_flags_amd flags_;
+ void* handle_;
+
+public:
+ LiquidFlashFile(const wchar_t* name, cl_file_flags_amd flags)
+ : name_(name), flags_(flags), handle_(NULL) { }
+
+ ~LiquidFlashFile();
+
+ bool open();
+ void close();
+
+ size_t blockSize() const;
+
+ size_t readBlocks(
+ void* dst,
+ uint32_t count,
+ const uint64_t* file_offsets,
+ const uint64_t* buffer_offsets,
+ const uint64_t* sizes);
+
+ virtual ObjectType objectType() const {return ObjectTypeLiquidFlashFile;}
+};
+
+LiquidFlashFile::~LiquidFlashFile()
+{
+ close();
+}
+
+bool
+LiquidFlashFile::open()
+{
+#if defined WITH_LIQUID_FLASH
+ lf_status err;
+ lf_file_flags flags;
+
+ switch (flags_) {
+ case CL_FILE_READ_ONLY_AMD: flags = LF_READ; break;
+ case CL_FILE_WRITE_ONLY_AMD: flags = LF_WRITE; break;
+ case CL_FILE_READ_WRITE_AMD: flags = LF_READ|LF_WRITE; break;
+ }
+
+ handle_ = lfOpenFile(name_, flags, &err);
+ if (err == lf_success) {
+ return true;
+ }
+#endif // WITH_LIQUID_FLASH
+ return false;
+}
+
+void
+LiquidFlashFile::close()
+{
+#if defined WITH_LIQUID_FLASH
+ if (handle_ != NULL) {
+ lfReleaseFile((lf_file)handle_);
+ handle_ = NULL;
+ }
+#endif // WITH_LIQUID_FLASH
+}
+
+size_t
+LiquidFlashFile::blockSize() const
+{
+#if defined WITH_LIQUID_FLASH
+ if (handle_ != NULL) {
+ lf_uint32 blockSize;
+ if (lfGetFileBlockSize((lf_file)handle_, &blockSize) == lf_success) {
+ return blockSize;
+ }
+ }
+#endif // WITH_LIQUID_FLASH
+ return 0;
+}
+
+} // namesapce amd
+
/*! \addtogroup API
* @{
*
@@ -16,26 +115,47 @@
RUNTIME_ENTRY_RET(cl_file_amd, clCreateFileObjectAMD, (
cl_context context,
- cl_file_flags_amd,
- cl_char * file_name,
- cl_int *errcode_ret))
+ cl_file_flags_amd flags,
+ const wchar_t* file_name,
+ cl_int* errcode_ret))
{
- *not_null(errcode_ret) = CL_INVALID_CONTEXT;
- return (cl_file_amd) 0;
+ amd::LiquidFlashFile* file = new amd::LiquidFlashFile(file_name, flags);
+
+ if (file == NULL) {
+ *not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
+ return (cl_file_amd)0;
+ }
+
+ if (!file->open()) {
+ *not_null(errcode_ret) = CL_INVALID_VALUE;
+ delete file;
+ return (cl_file_amd)0;
+ }
+
+ *not_null(errcode_ret) = CL_SUCCESS;
+ return as_cl(file);
}
RUNTIME_EXIT
RUNTIME_ENTRY(cl_int, clRetainFileObjectAMD, (
cl_file_amd file))
{
- return CL_INVALID_FILE_OBJECT_AMD;
+ if (!is_valid(file)) {
+ return CL_INVALID_FILE_OBJECT_AMD;
+ }
+ as_amd(file)->retain();
+ return CL_SUCCESS;
}
RUNTIME_EXIT
RUNTIME_ENTRY(cl_int, clReleaseFileObjectAMD, (
cl_file_amd file))
{
- return CL_INVALID_FILE_OBJECT_AMD;
+ if (!is_valid(file)) {
+ return CL_INVALID_FILE_OBJECT_AMD;
+ }
+ as_amd(file)->release();
+ return CL_SUCCESS;
}
RUNTIME_EXIT
diff --git a/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.h b/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.h
index 8de90f4107..7b857c2c9b 100644
--- a/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.h
+++ b/projects/clr/opencl/api/opencl/amdocl/cl_lqdflash_amd.h
@@ -11,7 +11,7 @@ extern CL_API_ENTRY cl_file_amd CL_API_CALL
clCreateFileObjectAMD(
cl_context context,
cl_file_flags_amd flags,
- cl_char * file_name,
+ const wchar_t * file_name,
cl_int * errcode_ret) CL_EXT_SUFFIX__VERSION_1_2;
extern CL_API_ENTRY cl_int CL_API_CALL
diff --git a/projects/clr/opencl/api/opencl/khronos/headers/opencl2.0/CL/cl_ext.h b/projects/clr/opencl/api/opencl/khronos/headers/opencl2.0/CL/cl_ext.h
index f9dbf0c528..8abf84b357 100644
--- a/projects/clr/opencl/api/opencl/khronos/headers/opencl2.0/CL/cl_ext.h
+++ b/projects/clr/opencl/api/opencl/khronos/headers/opencl2.0/CL/cl_ext.h
@@ -461,11 +461,14 @@ typedef CL_API_ENTRY cl_int
typedef struct _cl_file_amd * cl_file_amd;
typedef cl_uint cl_file_flags_amd;
+#define CL_FILE_READ_ONLY_AMD (1 << 0)
+#define CL_FILE_WRITE_ONLY_AMD (1 << 1)
+#define CL_FILE_READ_WRITE_AMD (1 << 2)
typedef CL_API_ENTRY cl_file_amd
(CL_API_CALL * clCreateFileObjectAMD_fn)( cl_context /*context*/,
cl_file_flags_amd /*flags*/,
- cl_char * /*file_name*/,
+ const wchar_t * /*file_name*/,
cl_int * /*errcode_ret*/) CL_EXT_SUFFIX__VERSION_1_2;
typedef CL_API_ENTRY cl_int