Add MSD entrypoints
Start initializing the driver.
Change-Id: I4717c864afe0d7811d2e1d9643763f3a484673dc
diff --git a/BUILD.gn b/BUILD.gn
index ad827a4..037b7b9 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -132,6 +132,11 @@
"generated/timerquery_bridge/server_timerquery_bridge.c",
]
+ sources += [
+ "fuchsia/msd_entrypoints.cc",
+ "fuchsia/msd_img_driver.cc",
+ ]
+
# According to Imagination, the kernel-esque driver should define this.
defines = [ "__KERNEL__" ]
@@ -200,4 +205,8 @@
configs -= [ "//build/config/fuchsia:werror" ]
+ deps = [
+ "//garnet/lib/magma/include:msd_abi",
+ "//garnet/lib/magma/src/magma_util",
+ ]
}
diff --git a/fuchsia/msd_entrypoints.cc b/fuchsia/msd_entrypoints.cc
new file mode 100644
index 0000000..6f1e86d
--- /dev/null
+++ b/fuchsia/msd_entrypoints.cc
@@ -0,0 +1,151 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stdint.h>
+#include <stdlib.h>
+#include "msd.h"
+
+#include "msd_img_driver.h"
+
+msd_driver_t*
+msd_driver_create(void)
+{
+ return MsdImgDriver::Create().release();
+}
+
+void
+msd_driver_configure(msd_driver_t* drv, uint32_t flags)
+{
+ MsdImgDriver::cast(drv)->configure(flags);
+}
+
+void
+msd_driver_destroy(msd_driver_t* drv)
+{
+ MsdImgDriver::Destroy(MsdImgDriver::cast(drv));
+}
+
+msd_device_t*
+msd_driver_create_device(msd_driver_t* drv, void* device)
+{
+ return nullptr;
+}
+
+void
+msd_device_destroy(msd_device_t* dev)
+{
+}
+
+magma_status_t
+msd_device_query(msd_device_t* device, uint64_t id, uint64_t* value_out)
+{
+ return MAGMA_STATUS_OK;
+}
+
+void
+msd_device_dump_status(msd_device_t* dev, uint32_t dump_flags)
+{
+}
+
+msd_connection_t*
+msd_device_open(msd_device_t* dev, msd_client_id_t client_id)
+{
+ return 0;
+}
+
+void
+msd_connection_close(msd_connection_t* connection)
+{
+}
+
+magma_status_t
+msd_connection_map_buffer_gpu(msd_connection_t* connection,
+ msd_buffer_t* buffer,
+ uint64_t gpu_va,
+ uint64_t page_offset,
+ uint64_t page_count,
+ uint64_t flags)
+{
+ return MAGMA_STATUS_OK;
+}
+magma_status_t
+msd_connection_unmap_buffer_gpu(msd_connection_t* connection, msd_buffer_t* buffer, uint64_t gpu_va)
+{
+ return MAGMA_STATUS_OK;
+}
+magma_status_t
+msd_connection_commit_buffer(msd_connection_t* connection, msd_buffer_t* buffer, uint64_t page_offset, uint64_t page_count)
+{
+ return MAGMA_STATUS_OK;
+}
+
+void
+msd_connection_set_notification_callback(msd_connection_t* connection,
+ msd_connection_notification_callback_t callback,
+ void* token)
+{
+}
+
+msd_context_t*
+msd_connection_create_context(msd_connection_t* connection)
+{
+ return 0;
+}
+
+void
+msd_context_destroy(msd_context_t* ctx)
+{
+}
+
+magma_status_t
+msd_context_execute_command_buffer(msd_context_t* ctx,
+ msd_buffer_t* cmd_buf,
+ msd_buffer_t** exec_resources,
+ msd_semaphore_t** wait_semaphores,
+ msd_semaphore_t** signal_semaphores)
+{
+ return MAGMA_STATUS_OK;
+}
+
+magma_status_t
+msd_context_execute_immediate_commands(msd_context_t* ctx,
+ uint64_t commands_size,
+ void* commands,
+ uint64_t semaphore_count,
+ msd_semaphore_t** semaphores)
+{
+ return MAGMA_STATUS_OK;
+}
+
+void
+msd_context_release_buffer(msd_context_t* context, msd_buffer_t* buffer)
+{
+}
+
+void
+msd_connection_release_buffer(msd_connection_t* connection, msd_buffer_t* buffer)
+{
+}
+
+msd_buffer_t*
+msd_buffer_import(uint32_t handle)
+{
+ return 0;
+}
+
+void
+msd_buffer_destroy(msd_buffer_t* buf)
+{
+}
+
+magma_status_t
+msd_semaphore_import(uint32_t handle, msd_semaphore_t** semaphore_out)
+{
+ return MAGMA_STATUS_OK;
+}
+
+void
+msd_semaphore_release(msd_semaphore_t* semaphore)
+{
+}
diff --git a/fuchsia/msd_img_driver.cc b/fuchsia/msd_img_driver.cc
new file mode 100644
index 0000000..2709905
--- /dev/null
+++ b/fuchsia/msd_img_driver.cc
@@ -0,0 +1,58 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "msd_img_driver.h"
+
+extern "C" {
+#include "process_stats.h"
+#include "pvrsrv.h"
+#include "pvrsrv_error.h"
+#include "rgxdevice.h"
+#include "srvcore.h"
+}
+
+
+static bool g_driver_initialized;
+
+MsdImgDriver::MsdImgDriver() { magic_ = kMagic; }
+
+MsdImgDriver::~MsdImgDriver()
+{
+ if (g_driver_initialized)
+ {
+ PVRSRVDriverDeInit();
+ g_driver_initialized = false;
+ }
+}
+
+// static
+std::unique_ptr<MsdImgDriver>
+MsdImgDriver::Create()
+{
+ DASSERT(!g_driver_initialized);
+ PVRSRV_ERROR pvrerr;
+#if defined(PVRSRV_ENABLE_PROCESS_STATS)
+ pvrerr = PVRSRVStatsInitialise();
+ if (pvrerr != PVRSRV_OK)
+ {
+ return DRETP(nullptr, "PVRSRVStatsInitialize failed: %d\n", pvrerr);
+ }
+#endif
+
+ pvrerr = PVRSRVDriverInit();
+ if (pvrerr != PVRSRV_OK)
+ {
+ return DRETP(nullptr, "PVRSRVDriverInit failed: %d\n", pvrerr);
+ return 0;
+ }
+ g_driver_initialized = true;
+ return std::unique_ptr<MsdImgDriver>(new MsdImgDriver);
+}
+
+// static
+void
+MsdImgDriver::Destroy(MsdImgDriver* driver)
+{
+ delete driver;
+}
diff --git a/fuchsia/msd_img_driver.h b/fuchsia/msd_img_driver.h
new file mode 100644
index 0000000..3ba4cc0
--- /dev/null
+++ b/fuchsia/msd_img_driver.h
@@ -0,0 +1,40 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MSD_IMG_DRIVER_H
+#define MSD_IMG_DRIVER_H
+
+#include <memory>
+
+#include "magma_util/macros.h"
+#include "msd.h"
+
+class MsdImgDriver : public msd_driver_t
+{
+ public:
+ virtual ~MsdImgDriver();
+
+ static std::unique_ptr<MsdImgDriver> Create();
+ static void Destroy(MsdImgDriver* drv);
+
+ static MsdImgDriver* cast(msd_driver_t* drv)
+ {
+ DASSERT(drv);
+ DASSERT(drv->magic_ == kMagic);
+ return static_cast<MsdImgDriver*>(drv);
+ }
+
+ void configure(uint32_t flags) { configure_flags_ = flags; }
+
+ uint32_t configure_flags() { return configure_flags_; }
+
+ private:
+ MsdImgDriver();
+
+ static const uint32_t kMagic = 0x64726976; //"driv"
+
+ uint32_t configure_flags_ = 0;
+};
+
+#endif // MSD_IMG_DRIVER_H