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 12 struct 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 */ 27 struct 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 */ 37 enum { 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 */ 53 struct cpu_info { 54 ulong cpu_freq; 55 ulong features; 56 uint address_width; 57 }; 58 59 struct 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 * release_core() - Relase a CPU core to the given address to run application 108 * 109 * @dev: Device to check (UCLASS_CPU) 110 * @addr: Address to relese the CPU core 111 * @return 0 if OK, -ve on error 112 */ 113 int (*release_core)(const struct udevice *dev, phys_addr_t addr); 114 }; 115 116 #define cpu_get_ops(dev) ((struct cpu_ops *)(dev)->driver->ops) 117 118 /** 119 * cpu_get_desc() - Get a description string for a CPU 120 * @dev: Device to check (UCLASS_CPU) 121 * @buf: Buffer to place string 122 * @size: Size of string space 123 * 124 * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error 125 */ 126 int cpu_get_desc(const struct udevice *dev, char *buf, int size); 127 128 /** 129 * cpu_get_info() - Get information about a CPU 130 * @dev: Device to check (UCLASS_CPU) 131 * @info: Returns CPU info 132 * 133 * Return: 0 if OK, -ve on error 134 */ 135 int cpu_get_info(const struct udevice *dev, struct cpu_info *info); 136 137 /** 138 * cpu_get_count() - Get number of CPUs 139 * @dev: Device to check (UCLASS_CPU) 140 * 141 * Return: CPU count if OK, -ve on error 142 */ 143 int cpu_get_count(const struct udevice *dev); 144 145 /** 146 * cpu_get_vendor() - Get vendor name of a CPU 147 * @dev: Device to check (UCLASS_CPU) 148 * @buf: Buffer to place string 149 * @size: Size of string space 150 * 151 * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error 152 */ 153 int cpu_get_vendor(const struct udevice *dev, char *buf, int size); 154 155 /** 156 * cpu_probe_all() - Probe all available CPUs 157 * 158 * Return: 0 if OK, -ve on error 159 */ 160 int cpu_probe_all(void); 161 162 /** 163 * cpu_is_current() - Check if the CPU that U-Boot is currently running from 164 * 165 * Return: 1 if yes, - 0 if not 166 */ 167 int cpu_is_current(struct udevice *cpu); 168 169 /** 170 * cpu_get_current_dev() - Get CPU udevice for current CPU 171 * 172 * Return: udevice if OK, - NULL on error 173 */ 174 struct udevice *cpu_get_current_dev(void); 175 176 /** 177 * cpu_release_core() - Relase a CPU core to the given address to run application 178 * 179 * @return 0 if OK, -ve on error 180 */ 181 int cpu_release_core(const struct udevice *dev, phys_addr_t addr); 182 183 /** 184 * cpu_phys_address_size() - Get the physical-address size for the CPU 185 * 186 * x86 CPUs have a setting which indicates how many bits of address space are 187 * available on the CPU. This is 32 for older CPUs but newer ones may support 36 188 * or more. 189 * 190 * For non-x86 CPUs the result may simply be 32 for 32-bit CPUS or 64 for 64-bit 191 * 192 * Return: address size (typically 32 or 36) 193 */ 194 int cpu_phys_address_size(void); 195 196 #endif 197