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