111f4dc15SSimon Glass /* 211f4dc15SSimon Glass * Copyright (C) 2015 Google, Inc 311f4dc15SSimon Glass * Written by Simon Glass <sjg@chromium.org> 411f4dc15SSimon Glass * 511f4dc15SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 611f4dc15SSimon Glass */ 711f4dc15SSimon Glass 811f4dc15SSimon Glass #include <common.h> 911f4dc15SSimon Glass #include <cpu.h> 1011f4dc15SSimon Glass #include <dm.h> 11166c3984SBin Meng #include <errno.h> 1211f4dc15SSimon Glass #include <dm/lists.h> 1311f4dc15SSimon Glass #include <dm/root.h> 1411f4dc15SSimon Glass 15*6e6f4ce4SBin Meng DECLARE_GLOBAL_DATA_PTR; 16*6e6f4ce4SBin Meng 1711f4dc15SSimon Glass int cpu_get_desc(struct udevice *dev, char *buf, int size) 1811f4dc15SSimon Glass { 1911f4dc15SSimon Glass struct cpu_ops *ops = cpu_get_ops(dev); 2011f4dc15SSimon Glass 2111f4dc15SSimon Glass if (!ops->get_desc) 2211f4dc15SSimon Glass return -ENOSYS; 2311f4dc15SSimon Glass 2411f4dc15SSimon Glass return ops->get_desc(dev, buf, size); 2511f4dc15SSimon Glass } 2611f4dc15SSimon Glass 2711f4dc15SSimon Glass int cpu_get_info(struct udevice *dev, struct cpu_info *info) 2811f4dc15SSimon Glass { 2911f4dc15SSimon Glass struct cpu_ops *ops = cpu_get_ops(dev); 3011f4dc15SSimon Glass 31cb5cbfd5SBin Meng if (!ops->get_info) 3211f4dc15SSimon Glass return -ENOSYS; 3311f4dc15SSimon Glass 3411f4dc15SSimon Glass return ops->get_info(dev, info); 3511f4dc15SSimon Glass } 3611f4dc15SSimon Glass 37780bfdd3SBin Meng int cpu_get_count(struct udevice *dev) 38780bfdd3SBin Meng { 39780bfdd3SBin Meng struct cpu_ops *ops = cpu_get_ops(dev); 40780bfdd3SBin Meng 41780bfdd3SBin Meng if (!ops->get_count) 42780bfdd3SBin Meng return -ENOSYS; 43780bfdd3SBin Meng 44780bfdd3SBin Meng return ops->get_count(dev); 45780bfdd3SBin Meng } 46780bfdd3SBin Meng 4711f4dc15SSimon Glass U_BOOT_DRIVER(cpu_bus) = { 4811f4dc15SSimon Glass .name = "cpu_bus", 4911f4dc15SSimon Glass .id = UCLASS_SIMPLE_BUS, 5011f4dc15SSimon Glass .per_child_platdata_auto_alloc_size = sizeof(struct cpu_platdata), 5111f4dc15SSimon Glass }; 5211f4dc15SSimon Glass 5311f4dc15SSimon Glass static int uclass_cpu_init(struct uclass *uc) 5411f4dc15SSimon Glass { 5511f4dc15SSimon Glass struct udevice *dev; 5611f4dc15SSimon Glass int node; 5711f4dc15SSimon Glass int ret; 5811f4dc15SSimon Glass 5911f4dc15SSimon Glass node = fdt_path_offset(gd->fdt_blob, "/cpus"); 6011f4dc15SSimon Glass if (node < 0) 6111f4dc15SSimon Glass return 0; 6211f4dc15SSimon Glass 6311f4dc15SSimon Glass ret = device_bind_driver_to_node(dm_root(), "cpu_bus", "cpus", node, 6411f4dc15SSimon Glass &dev); 6511f4dc15SSimon Glass 6611f4dc15SSimon Glass return ret; 6711f4dc15SSimon Glass } 6811f4dc15SSimon Glass 6911f4dc15SSimon Glass UCLASS_DRIVER(cpu) = { 7011f4dc15SSimon Glass .id = UCLASS_CPU, 7111f4dc15SSimon Glass .name = "cpu", 7211f4dc15SSimon Glass .flags = DM_UC_FLAG_SEQ_ALIAS, 7311f4dc15SSimon Glass .init = uclass_cpu_init, 7411f4dc15SSimon Glass }; 75