diff --git a/include/tvm/build_module.h b/include/tvm/build_module.h
index 75062e8197484da51dcd4b98f55542c824a81a4c..ae7ca3ca681d0e66c252ef1afa96ce22bcd36d4d 100644
--- a/include/tvm/build_module.h
+++ b/include/tvm/build_module.h
@@ -73,6 +73,9 @@ EXPORT Target metal();
 /*! \return A target for rasp */
 EXPORT Target rasp();
 
+/*! \return A target for Mali */
+EXPORT Target mali();
+
 /*! \return A target for stackvm */
 EXPORT Target stackvm();
 
diff --git a/python/tvm/target.py b/python/tvm/target.py
index 3437e70e0a6d74b42a312cd57db4db0798f5e078..4584c1aa4d239a18df912e17ad9537854f9eb34c 100644
--- a/python/tvm/target.py
+++ b/python/tvm/target.py
@@ -81,6 +81,7 @@ class Target(object):
     - :any:`tvm.target.rasp` create raspberry pi target
     - :any:`tvm.target.cuda` create CUDA target
     - :any:`tvm.target.rocm` create ROCM target
+    - :any:`tvm.target.mali` create Mali target
     """
     current = None
 
@@ -306,6 +307,8 @@ def create(target_str):
             device_name = item.split("=")[1]
     if device_name == "rasp":
         return rasp(arr[1:])
+    if device_name == "mali":
+        return mali(arr[1:])
     return Target(arr[0], arr[1:])
 
 
diff --git a/src/codegen/build_module.cc b/src/codegen/build_module.cc
index 2c419d43da08ba29c2189c5aeac90a397a53b539..df71a4a41bec5cddda1e8bd01e8bb59622a7ddbb 100644
--- a/src/codegen/build_module.cc
+++ b/src/codegen/build_module.cc
@@ -70,7 +70,8 @@ Target Target::create(const std::string& target_str) {
 
   auto result = device_name == "rasp" ?
     target::rasp() :
-    TargetFromName(target_name);
+    (device_name == "mali" ? target::mali() :
+    TargetFromName(target_name));
 
   std::string item;
   while (ss >> item) {
@@ -116,6 +117,15 @@ Target rasp() {
   return Target("llvm", kDLCPU, 512, 1, keys, options);
 }
 
+Target mali() {
+  std::unordered_set<std::string> keys({ "rocm", "gpu" });
+  std::vector<std::string> options({
+    "-device=mali"
+  });
+  return Target("opencl", kDLOpenCL, 256, 1, keys, options);
+}
+
+
 Target stackvm() {
   std::unordered_set<std::string> keys({ "stackvm", "cpu" });
   std::vector<std::string> options;