1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Copyright (c) 2015 Google, Inc 4 * Written by Simon Glass <sjg@chromium.org> 5 */ 6 7#ifndef __CPU_H 8#define __CPU_H 9 10#include <linux/types.h> 11 12struct udevice; 13 14/** 15 * struct cpu_plat - platform data for a CPU 16 * @cpu_id: Platform-specific way of identifying the CPU. 17 * @ucode_version: Microcode version, if CPU_FEAT_UCODE is set 18 * @device_id: Driver-defined device identifier 19 * @family: DMTF CPU Family identifier 20 * @id: DMTF CPU Processor identifier 21 * @timebase_freq: the current frequency at which the cpu timer timebase 22 * registers are updated (in Hz) 23 * 24 * This can be accessed with dev_get_parent_plat() for any UCLASS_CPU 25 * device. 26 */ 27struct cpu_plat { 28 int cpu_id; 29 int ucode_version; 30 ulong device_id; 31 u16 family; 32 u32 id[2]; 33 u32 timebase_freq; 34}; 35 36/* CPU features - mostly just a placeholder for now */ 37enum { 38 CPU_FEAT_L1_CACHE = 0, /* Supports level 1 cache */ 39 CPU_FEAT_MMU = 1, /* Supports virtual memory */ 40 CPU_FEAT_UCODE = 2, /* Requires/uses microcode */ 41 CPU_FEAT_DEVICE_ID = 3, /* Provides a device ID */ 42 43 CPU_FEAT_COUNT, 44}; 45 46/** 47 * struct cpu_info - Information about a CPU 48 * 49 * @cpu_freq: Current CPU frequency in Hz 50 * @features: Flags for supported CPU features 51 * @address_width: Width of the CPU address space in bits (e.g. 32) 52 */ 53struct cpu_info { 54 ulong cpu_freq; 55 ulong features; 56 uint address_width; 57}; 58 59struct cpu_ops { 60 /** 61 * get_desc() - Get a description string for a CPU 62 * 63 * @dev: Device to check (UCLASS_CPU) 64 * @buf: Buffer to place string 65 * @size: Size of string space 66 * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 67 */ 68 int (*get_desc)(const struct udevice *dev, char *buf, int size); 69 70 /** 71 * get_info() - Get information about a CPU 72 * 73 * @dev: Device to check (UCLASS_CPU) 74 * @info: Returns CPU info 75 * @return 0 if OK, -ve on error 76 */ 77 int (*get_info)(const struct udevice *dev, struct cpu_info *info); 78 79 /** 80 * get_count() - Get number of CPUs 81 * 82 * @dev: Device to check (UCLASS_CPU) 83 * @return CPU count if OK, -ve on error 84 */ 85 int (*get_count)(const struct udevice *dev); 86 87 /** 88 * get_vendor() - Get vendor name of a CPU 89 * 90 * @dev: Device to check (UCLASS_CPU) 91 * @buf: Buffer to place string 92 * @size: Size of string space 93 * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 94 */ 95 int (*get_vendor)(const struct udevice *dev, char *buf, int size); 96 97 /** 98 * is_current() - Check if the CPU that U-Boot is currently running from 99 * 100 * @dev: Device to check (UCLASS_CPU) 101 * @return 1 if the CPU that U-Boot is currently running from, 0 102 * if not. 103 */ 104 int (*is_current)(struct udevice *dev); 105}; 106 107#define cpu_get_ops(dev) ((struct cpu_ops *)(dev)->driver->ops) 108 109/** 110 * cpu_get_desc() - Get a description string for a CPU 111 * @dev: Device to check (UCLASS_CPU) 112 * @buf: Buffer to place string 113 * @size: Size of string space 114 * 115 * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error 116 */ 117int cpu_get_desc(const struct udevice *dev, char *buf, int size); 118 119/** 120 * cpu_get_info() - Get information about a CPU 121 * @dev: Device to check (UCLASS_CPU) 122 * @info: Returns CPU info 123 * 124 * Return: 0 if OK, -ve on error 125 */ 126int cpu_get_info(const struct udevice *dev, struct cpu_info *info); 127 128/** 129 * cpu_get_count() - Get number of CPUs 130 * @dev: Device to check (UCLASS_CPU) 131 * 132 * Return: CPU count if OK, -ve on error 133 */ 134int cpu_get_count(const struct udevice *dev); 135 136/** 137 * cpu_get_vendor() - Get vendor name of a CPU 138 * @dev: Device to check (UCLASS_CPU) 139 * @buf: Buffer to place string 140 * @size: Size of string space 141 * 142 * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error 143 */ 144int cpu_get_vendor(const struct udevice *dev, char *buf, int size); 145 146/** 147 * cpu_probe_all() - Probe all available CPUs 148 * 149 * Return: 0 if OK, -ve on error 150 */ 151int cpu_probe_all(void); 152 153/** 154 * cpu_is_current() - Check if the CPU that U-Boot is currently running from 155 * 156 * Return: 1 if yes, - 0 if not 157 */ 158int cpu_is_current(struct udevice *cpu); 159 160/** 161 * cpu_get_current_dev() - Get CPU udevice for current CPU 162 * 163 * Return: udevice if OK, - NULL on error 164 */ 165struct udevice *cpu_get_current_dev(void); 166 167#endif 168