/* TODO: For GPU node, rearrange code from kfd_topology_add_device */
 }
 
+/* kfd_is_acpi_crat_invalid - CRAT from ACPI is valid only for AMD APU devices.
+ *     Ignore CRAT for all other devices. AMD APU is identified if both CPU
+ *     and GPU cores are present.
+ * @device_list - topology device list created by parsing ACPI CRAT table.
+ * @return - TRUE if invalid, FALSE is valid.
+ */
+static bool kfd_is_acpi_crat_invalid(struct list_head *device_list)
+{
+       struct kfd_topology_device *dev;
+
+       list_for_each_entry(dev, device_list, list) {
+               if (dev->node_props.cpu_cores_count &&
+                       dev->node_props.simd_count)
+                       return false;
+       }
+       pr_info("Ignoring ACPI CRAT on non-APU system\n");
+       return true;
+}
+
 int kfd_topology_init(void)
 {
        void *crat_image = NULL;
 
        /*
         * Get the CRAT image from the ACPI. If ACPI doesn't have one
-        * create a virtual CRAT.
+        * or if ACPI CRAT is invalid create a virtual CRAT.
         * NOTE: The current implementation expects all AMD APUs to have
         *      CRAT. If no CRAT is available, it is assumed to be a CPU
         */
                ret = kfd_parse_crat_table(crat_image,
                                           &temp_topology_device_list,
                                           proximity_domain);
-               if (ret) {
+               if (ret ||
+                   kfd_is_acpi_crat_invalid(&temp_topology_device_list)) {
                        kfd_release_topology_device_list(
                                &temp_topology_device_list);
                        kfd_destroy_crat_image(crat_image);