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 156e6f4ce4SBin Meng DECLARE_GLOBAL_DATA_PTR; 166e6f4ce4SBin 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 47*94eaa79cSAlexander Graf int cpu_get_vendor(struct udevice *dev, char *buf, int size) 48*94eaa79cSAlexander Graf { 49*94eaa79cSAlexander Graf struct cpu_ops *ops = cpu_get_ops(dev); 50*94eaa79cSAlexander Graf 51*94eaa79cSAlexander Graf if (!ops->get_vendor) 52*94eaa79cSAlexander Graf return -ENOSYS; 53*94eaa79cSAlexander Graf 54*94eaa79cSAlexander Graf return ops->get_vendor(dev, buf, size); 55*94eaa79cSAlexander Graf } 56*94eaa79cSAlexander Graf 5711f4dc15SSimon Glass U_BOOT_DRIVER(cpu_bus) = { 5811f4dc15SSimon Glass .name = "cpu_bus", 5911f4dc15SSimon Glass .id = UCLASS_SIMPLE_BUS, 6011f4dc15SSimon Glass .per_child_platdata_auto_alloc_size = sizeof(struct cpu_platdata), 6111f4dc15SSimon Glass }; 6211f4dc15SSimon Glass 6311f4dc15SSimon Glass static int uclass_cpu_init(struct uclass *uc) 6411f4dc15SSimon Glass { 6511f4dc15SSimon Glass struct udevice *dev; 6611f4dc15SSimon Glass int node; 6711f4dc15SSimon Glass int ret; 6811f4dc15SSimon Glass 6911f4dc15SSimon Glass node = fdt_path_offset(gd->fdt_blob, "/cpus"); 7011f4dc15SSimon Glass if (node < 0) 7111f4dc15SSimon Glass return 0; 7211f4dc15SSimon Glass 7311f4dc15SSimon Glass ret = device_bind_driver_to_node(dm_root(), "cpu_bus", "cpus", node, 7411f4dc15SSimon Glass &dev); 7511f4dc15SSimon Glass 7611f4dc15SSimon Glass return ret; 7711f4dc15SSimon Glass } 7811f4dc15SSimon Glass 7911f4dc15SSimon Glass UCLASS_DRIVER(cpu) = { 8011f4dc15SSimon Glass .id = UCLASS_CPU, 8111f4dc15SSimon Glass .name = "cpu", 8211f4dc15SSimon Glass .flags = DM_UC_FLAG_SEQ_ALIAS, 8311f4dc15SSimon Glass .init = uclass_cpu_init, 8411f4dc15SSimon Glass }; 85