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)