Add RISC-V 64-bit support

For now this is just for bootloader/kernel testing.

Bug: 260012551
Change-Id: I28b151f4bb3adce57f5a58187deaf6f580b7553f
diff --git a/Android.mk b/Android.mk
index d419260..eca8725 100644
--- a/Android.mk
+++ b/Android.mk
@@ -47,7 +47,7 @@
 $(eval $(call declare-1p-copy-files,device/google/cuttlefish,preinstalled-packages-product-car-cuttlefish.xml))
 $(eval $(call declare-1p-copy-files,hardware/google/camera/devices,.json))
 
-ifneq ($(filter vsoc_arm vsoc_arm64 vsoc_x86 vsoc_x86_64, $(TARGET_BOARD_PLATFORM)),)
+ifneq ($(filter vsoc_arm vsoc_arm64 vsoc_riscv64 vsoc_x86 vsoc_x86_64, $(TARGET_BOARD_PLATFORM)),)
 LOCAL_PATH:= $(call my-dir)
 
 include $(CLEAR_VARS)
diff --git a/AndroidProducts.mk b/AndroidProducts.mk
index b0cbd04..82a792c 100644
--- a/AndroidProducts.mk
+++ b/AndroidProducts.mk
@@ -23,6 +23,8 @@
 	aosp_cf_arm64_only_phone_hwasan:$(LOCAL_DIR)/vsoc_arm64_only/phone/aosp_cf_hwasan.mk \
 	aosp_cf_arm64_minidroid:$(LOCAL_DIR)/vsoc_arm64_minidroid/aosp_cf.mk \
 	aosp_cf_arm64_slim:$(LOCAL_DIR)/vsoc_arm64_only/slim/aosp_cf.mk \
+	aosp_cf_riscv64_minidroid:$(LOCAL_DIR)/vsoc_riscv64_minidroid/aosp_cf.mk \
+	aosp_cf_riscv64_slim:$(LOCAL_DIR)/vsoc_riscv64/slim/aosp_cf.mk \
 	aosp_cf_x86_64_auto:$(LOCAL_DIR)/vsoc_x86_64/auto/aosp_cf.mk \
 	aosp_cf_x86_64_only_auto:$(LOCAL_DIR)/vsoc_x86_64_only/auto/aosp_cf.mk \
 	aosp_cf_x86_64_pc:$(LOCAL_DIR)/vsoc_x86_64/pc/aosp_cf.mk \
diff --git a/build/Android.bp b/build/Android.bp
index af310b0..b1ec30d 100644
--- a/build/Android.bp
+++ b/build/Android.bp
@@ -209,9 +209,10 @@
 ]
 
 cvd_host_qemu_bootloader = [
-    "bootloader_qemu_x86_64",
     "bootloader_qemu_aarch64",
     "bootloader_qemu_arm",
+    "bootloader_qemu_riscv64",
+    "bootloader_qemu_x86_64",
 ]
 
 prebuilt_etc_host {
diff --git a/common/libs/utils/environment.cpp b/common/libs/utils/environment.cpp
index ca7f682..c9f3847 100644
--- a/common/libs/utils/environment.cpp
+++ b/common/libs/utils/environment.cpp
@@ -89,6 +89,8 @@
     return Arch::Arm64;
   } else if (arch_str == "arm") {
     return Arch::Arm;
+  } else if (arch_str == "riscv64") {
+    return Arch::RiscV64;
   } else if (arch_str == "x86_64") {
     return Arch::X86_64;
   } else if (arch_str.size() == 4 && arch_str[0] == 'i' && arch_str[2] == '8' &&
diff --git a/common/libs/utils/environment.h b/common/libs/utils/environment.h
index 004a849..b84c036 100644
--- a/common/libs/utils/environment.h
+++ b/common/libs/utils/environment.h
@@ -22,6 +22,7 @@
 enum class Arch {
   Arm,
   Arm64,
+  RiscV64,
   X86,
   X86_64,
 };
diff --git a/host/commands/assemble_cvd/flags.cc b/host/commands/assemble_cvd/flags.cc
index c5a0d27..d21efda 100644
--- a/host/commands/assemble_cvd/flags.cc
+++ b/host/commands/assemble_cvd/flags.cc
@@ -556,6 +556,8 @@
       kernel_config.target_arch = Arch::Arm;
     } else if (config.find("\nCONFIG_ARM64=y") != std::string::npos) {
       kernel_config.target_arch = Arch::Arm64;
+    } else if (config.find("\nCONFIG_ARCH_RV64I=y") != std::string::npos) {
+      kernel_config.target_arch = Arch::RiscV64;
     } else if (config.find("\nCONFIG_X86_64=y") != std::string::npos) {
       kernel_config.target_arch = Arch::X86_64;
     } else if (config.find("\nCONFIG_X86=y") != std::string::npos) {
@@ -1284,6 +1286,9 @@
           // TODO(b/260960328) : Migrate openwrt image for arm64 into
           // APBootFlow::Grub.
           break;
+        case Arch::RiscV64:
+          // TODO: RISCV port doesn't have grub-efi-bin yet
+          break;
         case Arch::X86:
         case Arch::X86_64:
           required_grub_image_path = kBootSrcPathIA32;
@@ -1381,6 +1386,8 @@
       default_bootloader += "arm";
   } else if (target_arch == Arch::Arm64) {
       default_bootloader += "aarch64";
+  } else if (target_arch == Arch::RiscV64) {
+      default_bootloader += "riscv64";
   } else {
       default_bootloader += "x86_64";
   }
diff --git a/host/libs/config/cuttlefish_config_instance.cpp b/host/libs/config/cuttlefish_config_instance.cpp
index 2fa08c3..e8dcdd5 100644
--- a/host/libs/config/cuttlefish_config_instance.cpp
+++ b/host/libs/config/cuttlefish_config_instance.cpp
@@ -774,7 +774,8 @@
     // console can't be used since uboot doesn't support it.
     console_dev = "hvc1";
   } else {
-    // crosvm ARM does not support ttyAMA. ttyAMA is a part of ARM arch.
+    // QEMU and Gem5 emulate pl011 on ARM/ARM64, but QEMU and crosvm on other
+    // architectures emulate ns16550a/uart8250 instead.
     Arch target = target_arch();
     if ((target == Arch::Arm64 || target == Arch::Arm) &&
         config_->vm_manager() != vm_manager::CrosvmManager::name()) {
diff --git a/host/libs/config/data_image.cpp b/host/libs/config/data_image.cpp
index a678516..0b2d9a3 100644
--- a/host/libs/config/data_image.cpp
+++ b/host/libs/config/data_image.cpp
@@ -431,6 +431,9 @@
           builder.File(kMultibootModuleSrcPathAA64, kMultibootModuleDestPathAA64,
                         /* required */ false);
           break;
+        case Arch::RiscV64:
+          // FIXME: Implement
+          break;
         case Arch::X86:
         case Arch::X86_64:
           builder.File(kBootSrcPathIA32, kBootDestPathIA32, /* required */ true);
diff --git a/host/libs/config/kernel_args.cpp b/host/libs/config/kernel_args.cpp
index 929f197..bc45be4 100644
--- a/host/libs/config/kernel_args.cpp
+++ b/host/libs/config/kernel_args.cpp
@@ -54,6 +54,15 @@
         // In the virt.dts file, look for a uart node
         vm_manager_cmdline.push_back("earlycon=pl011,mmio32,0x9000000");
       }
+    } else if (target_arch == Arch::RiscV64) {
+        vm_manager_cmdline.push_back("console=hvc0");
+
+        // To update the uart8250 address:
+        // $ qemu-system-riscv64 -machine virt -machine dumpdtb=virt.dtb
+        // $ dtc -O dts -o virt.dts -I dtb virt.dtb
+        // In the virt.dts file, look for a uart node
+        // Only 'mmio' mode works; mmio32 does not
+        vm_manager_cmdline.push_back("earlycon=uart8250,mmio,0x10000000");
     } else {
       if (instance.enable_kernel_log()) {
         vm_manager_cmdline.push_back("console=hvc0");
diff --git a/host/libs/vm_manager/gem5_manager.cpp b/host/libs/vm_manager/gem5_manager.cpp
index fb271f5..4d21f62 100644
--- a/host/libs/vm_manager/gem5_manager.cpp
+++ b/host/libs/vm_manager/gem5_manager.cpp
@@ -168,6 +168,9 @@
     case Arch::Arm64:
       gem5_binary += "/build/ARM/gem5.opt";
       break;
+    case Arch::RiscV64:
+      gem5_binary += "/build/RISCV/gem5.opt";
+      break;
     case Arch::X86:
     case Arch::X86_64:
       gem5_binary += "/build/X86/gem5.opt";
diff --git a/host/libs/vm_manager/qemu_manager.cpp b/host/libs/vm_manager/qemu_manager.cpp
index 595c1e3..57cf81d 100644
--- a/host/libs/vm_manager/qemu_manager.cpp
+++ b/host/libs/vm_manager/qemu_manager.cpp
@@ -161,6 +161,12 @@
 
 std::string QemuManager::ConfigureBootDevices(int num_disks, bool have_gpu) {
   switch (arch_) {
+    case Arch::Arm:
+      return "androidboot.boot_devices=3f000000.pcie";
+    case Arch::Arm64:
+      return "androidboot.boot_devices=4010000000.pcie";
+    case Arch::RiscV64:
+      return "androidboot.boot_devices=30000000.pci";
     case Arch::X86:
     case Arch::X86_64: {
       // QEMU has additional PCI devices for an ISA bridge and PIIX4
@@ -168,10 +174,6 @@
       return ConfigureMultipleBootDevices("pci0000:00/0000:00:",
                                           2 + (have_gpu ? 1 : 0), num_disks);
     }
-    case Arch::Arm:
-      return "androidboot.boot_devices=3f000000.pcie";
-    case Arch::Arm64:
-      return "androidboot.boot_devices=4010000000.pcie";
   }
 }
 
@@ -198,6 +200,9 @@
     case Arch::Arm64:
       qemu_binary += "/qemu-system-aarch64";
       break;
+    case Arch::RiscV64:
+      qemu_binary += "/qemu-system-riscv64";
+      break;
     case Arch::X86:
       qemu_binary += "/qemu-system-i386";
       break;
@@ -274,6 +279,7 @@
   };
 
   bool is_arm = arch_ == Arch::Arm || arch_ == Arch::Arm64;
+  bool is_x86 = arch_ == Arch::X86 || arch_ == Arch::X86_64;
   bool is_arm64 = arch_ == Arch::Arm64;
 
   auto access_kregistry_size_bytes = 0;
@@ -308,7 +314,7 @@
   qemu_cmd.AddParameter("guest=", instance.instance_name(), ",debug-threads=on");
 
   qemu_cmd.AddParameter("-machine");
-  std::string machine = is_arm ? "virt" : "pc-i440fx-2.8,nvdimm=on";
+  std::string machine = is_x86 ? "pc-i440fx-2.8,nvdimm=on" : "virt";
   if (IsHostCompatible(arch_)) {
     machine += ",accel=kvm";
     if (is_arm) {
@@ -330,8 +336,8 @@
   auto maxmem = instance.memory_mb() +
                 (access_kregistry_size_bytes / 1024 / 1024) +
                 (hwcomposer_pmem_size_bytes / 1024 / 1024) +
-                (is_arm ? 0 : pstore_size_bytes / 1024 / 1024);
-  auto slots = is_arm ? "" : ",slots=2";
+                (is_x86 ? pstore_size_bytes / 1024 / 1024 : 0);
+  auto slots = is_x86 ? ",slots=2" : "";
   qemu_cmd.AddParameter("size=", instance.memory_mb(), "M",
                         ",maxmem=", maxmem, "M", slots);
 
@@ -508,7 +514,7 @@
                           ",id=virtio-disk", i, bootindex);
   }
 
-  if (!is_arm && FileExists(instance.pstore_path())) {
+  if (is_x86 && FileExists(instance.pstore_path())) {
     // QEMU will assign the NVDIMM (ramoops pstore region) 100000000-1001fffff
     // As we will pass this to ramoops, define this region first so it is always
     // located at this address. This is currently x86 only.
@@ -520,9 +526,9 @@
     qemu_cmd.AddParameter("nvdimm,memdev=objpmem0,id=ramoops");
   }
 
-  // QEMU does not implement virtio-pmem-pci for ARM64 yet; restore this
-  // when the device has been added
-  if (!is_arm) {
+  // QEMU does not implement virtio-pmem-pci for ARM64 or RISC-V yet; restore
+  // this when the device has been added
+  if (is_x86) {
     if (access_kregistry_size_bytes > 0) {
       qemu_cmd.AddParameter("-object");
       qemu_cmd.AddParameter(
@@ -590,8 +596,10 @@
   qemu_cmd.AddParameter("virtio-net-pci-non-transitional,netdev=hostnet2,id=net2");
 #endif
 
-  qemu_cmd.AddParameter("-cpu");
-  qemu_cmd.AddParameter(IsHostCompatible(arch_) ? "host" : "max");
+  if (is_x86 || is_arm) {
+    qemu_cmd.AddParameter("-cpu");
+    qemu_cmd.AddParameter(IsHostCompatible(arch_) ? "host" : "max");
+  }
 
   qemu_cmd.AddParameter("-msg");
   qemu_cmd.AddParameter("timestamp=on");
diff --git a/shared/device.mk b/shared/device.mk
index f8cfae2..6c61f5a 100644
--- a/shared/device.mk
+++ b/shared/device.mk
@@ -492,8 +492,10 @@
 #
 # Dice HAL
 #
+ifneq ($(filter-out %_riscv64,$(TARGET_PRODUCT)),)
 PRODUCT_PACKAGES += \
     android.hardware.security.dice-service.non-secure-software
+endif
 
 #
 # Power and PowerStats HALs
diff --git a/vsoc_riscv64/BoardConfig.mk b/vsoc_riscv64/BoardConfig.mk
new file mode 100644
index 0000000..f0d211b
--- /dev/null
+++ b/vsoc_riscv64/BoardConfig.mk
@@ -0,0 +1,44 @@
+#
+# Copyright 2022 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# risv64 (64-bit only) target for Cuttlefish
+#
+
+TARGET_BOARD_PLATFORM := vsoc_riscv64
+TARGET_ARCH := riscv64
+TARGET_ARCH_VARIANT :=
+TARGET_CPU_VARIANT := generic
+TARGET_CPU_ABI := riscv64
+
+AUDIOSERVER_MULTILIB := first
+
+# Include 64-bit mediaserver to support 64-bit only devices
+TARGET_DYNAMIC_64_32_MEDIASERVER := true
+
+# Temporary hack while prebuilt modules are missing riscv64.
+ALLOW_MISSING_DEPENDENCIES := true
+
+TARGET_KERNEL_ARCH ?= $(TARGET_ARCH)
+TARGET_KERNEL_USE ?= mainline
+KERNEL_MODULES_PATH := device/google/cuttlefish_prebuilts/kernel/$(TARGET_KERNEL_USE)-$(TARGET_KERNEL_ARCH)
+TARGET_KERNEL_PATH := $(KERNEL_MODULES_PATH)/kernel-$(TARGET_KERNEL_USE)
+# FIXME: system_dlkm should be specified as well
+
+-include device/google/cuttlefish/shared/BoardConfig.mk
+-include device/google/cuttlefish/shared/camera/BoardConfig.mk
+-include device/google/cuttlefish/shared/graphics/BoardConfig.mk
+-include device/google/cuttlefish/shared/telephony/BoardConfig.mk
diff --git a/vsoc_riscv64/bootloader.mk b/vsoc_riscv64/bootloader.mk
new file mode 100644
index 0000000..427531b
--- /dev/null
+++ b/vsoc_riscv64/bootloader.mk
@@ -0,0 +1,20 @@
+#
+# Copyright (C) 2022 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+TARGET_NO_BOOTLOADER := false
+# Only QEMU is supported for now
+BOARD_PREBUILT_BOOTLOADER := \
+    device/google/cuttlefish_prebuilts/bootloader/qemu_riscv64/u-boot.bin
diff --git a/vsoc_riscv64/slim/aosp_cf.mk b/vsoc_riscv64/slim/aosp_cf.mk
new file mode 100644
index 0000000..ac28f7a
--- /dev/null
+++ b/vsoc_riscv64/slim/aosp_cf.mk
@@ -0,0 +1,102 @@
+#
+# Copyright (C) 2022 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# All components inherited here go to system image (same as GSI system)
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+#$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_system.mk)
+
+# TODO: FIXME: Start workaround for generic_system.mk ########################
+TARGET_NO_RECOVERY := true
+TARGET_FLATTEN_APEX := false
+
+# TODO: this list should come via mainline_system.mk, but for now list
+# just the modules that work for riscv64.
+PRODUCT_PACKAGES := \
+    init.environ.rc \
+    init_first_stage \
+    init_system \
+    linker \
+    shell_and_utilities \
+
+$(call inherit-product, $(SRC_TARGET_DIR)/product/default_art_config.mk)
+PRODUCT_USES_DEFAULT_ART_CONFIG := false
+
+PRODUCT_BRAND := generic
+# TODO: FIXME: Stop workaround for generic_system.mk #########################
+
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
+
+#
+# All components inherited here go to system_ext image (same as GSI system_ext)
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_system_ext.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_system_ext.mk)
+
+#
+# All components inherited here go to product image (same as GSI product)
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_product.mk)
+
+#
+# All components inherited here go to vendor image
+#
+LOCAL_PREFER_VENDOR_APEX := true
+#$(call inherit-product, device/google/cuttlefish/shared/slim/device_vendor.mk)
+
+# TODO: FIXME: Start workaround for slim/device_vendor.mk ####################
+PRODUCT_MANIFEST_FILES += device/google/cuttlefish/shared/config/product_manifest.xml
+SYSTEM_EXT_MANIFEST_FILES += device/google/cuttlefish/shared/config/system_ext_manifest.xml
+
+$(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_vendor.mk)
+
+$(call inherit-product, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk)
+$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/graphics/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/telephony/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/device.mk)
+
+PRODUCT_VENDOR_PROPERTIES += \
+    debug.hwui.drawing_enabled=0 \
+
+PRODUCT_PACKAGES += \
+    com.google.aosp_cf_phone.rros \
+    com.google.aosp_cf_slim.rros
+
+TARGET_BOARD_INFO_FILE ?= device/google/cuttlefish/shared/slim/android-info.txt
+# TODO: FIXME: Stop workaround for slim/device_vendor.mk #####################
+
+# TODO(b/205788876) remove this when openwrt has an image for riscv64
+PRODUCT_ENFORCE_MAC80211_HWSIM := false
+
+#
+# Special settings for the target
+#
+$(call inherit-product, device/google/cuttlefish/vsoc_riscv64/bootloader.mk)
+
+# Exclude features that are not available on AOSP devices.
+PRODUCT_COPY_FILES += \
+    frameworks/native/data/etc/aosp_excluded_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/aosp_excluded_hardware.xml
+
+PRODUCT_NAME := aosp_cf_riscv64_slim
+PRODUCT_DEVICE := vsoc_riscv64
+PRODUCT_MANUFACTURER := Google
+PRODUCT_MODEL := Cuttlefish riscv64 slim
+
+PRODUCT_VENDOR_PROPERTIES += \
+    ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \
+    ro.soc.model=$(PRODUCT_DEVICE)
diff --git a/vsoc_riscv64_minidroid/BoardConfig.mk b/vsoc_riscv64_minidroid/BoardConfig.mk
new file mode 100644
index 0000000..1260f47
--- /dev/null
+++ b/vsoc_riscv64_minidroid/BoardConfig.mk
@@ -0,0 +1,36 @@
+#
+# Copyright 2022 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# riscv64 (64-bit only) target for Cuttlefish
+#
+
+TARGET_BOARD_PLATFORM := vsoc_riscv64
+TARGET_ARCH := riscv64
+TARGET_ARCH_VARIANT :=
+TARGET_CPU_VARIANT := generic
+TARGET_CPU_ABI := riscv64
+
+# Temporary hack while prebuilt modules are missing riscv64.
+ALLOW_MISSING_DEPENDENCIES := true
+
+TARGET_KERNEL_ARCH ?= $(TARGET_ARCH)
+TARGET_KERNEL_USE ?= mainline
+KERNEL_MODULES_PATH := device/google/cuttlefish_prebuilts/kernel/$(TARGET_KERNEL_USE)-$(TARGET_KERNEL_ARCH)
+TARGET_KERNEL_PATH := $(KERNEL_MODULES_PATH)/kernel-$(TARGET_KERNEL_USE)
+# FIXME: system_dlkm should be specified as well
+
+-include device/google/cuttlefish/shared/minidroid/BoardConfig.mk
diff --git a/vsoc_riscv64_minidroid/aosp_cf.mk b/vsoc_riscv64_minidroid/aosp_cf.mk
new file mode 100644
index 0000000..813b3c0
--- /dev/null
+++ b/vsoc_riscv64_minidroid/aosp_cf.mk
@@ -0,0 +1,28 @@
+#
+# Copyright (C) 2022 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+$(call inherit-product, device/google/cuttlefish/shared/minidroid/device.mk)
+
+$(call inherit-product, device/google/cuttlefish/vsoc_riscv64/bootloader.mk)
+
+PRODUCT_NAME := aosp_cf_riscv64_minidroid
+PRODUCT_DEVICE := vsoc_riscv64_minidroid
+PRODUCT_MANUFACTURER := Google
+PRODUCT_MODEL := Cuttlefish riscv64 minidroid
+
+PRODUCT_VENDOR_PROPERTIES += \
+    ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \
+    ro.soc.model=$(PRODUCT_DEVICE)