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 #ifndef __CPU_H 911f4dc15SSimon Glass #define __CPU_H 1011f4dc15SSimon Glass 1111f4dc15SSimon Glass /** 1211f4dc15SSimon Glass * struct cpu_platdata - platform data for a CPU 1311f4dc15SSimon Glass * 1411f4dc15SSimon Glass * This can be accessed with dev_get_parent_platdata() for any UCLASS_CPU 1511f4dc15SSimon Glass * device. 1611f4dc15SSimon Glass * 1711f4dc15SSimon Glass * @cpu_id: Platform-specific way of identifying the CPU. 18*740d5d34SSimon Glass * @ucode_version: Microcode version, if CPU_FEAT_UCODE is set 1911f4dc15SSimon Glass */ 2011f4dc15SSimon Glass struct cpu_platdata { 2111f4dc15SSimon Glass int cpu_id; 22*740d5d34SSimon Glass int ucode_version; 23*740d5d34SSimon Glass ulong device_id; 2411f4dc15SSimon Glass }; 2511f4dc15SSimon Glass 2611f4dc15SSimon Glass /* CPU features - mostly just a placeholder for now */ 2711f4dc15SSimon Glass enum { 2811f4dc15SSimon Glass CPU_FEAT_L1_CACHE = 0, /* Supports level 1 cache */ 2911f4dc15SSimon Glass CPU_FEAT_MMU = 1, /* Supports virtual memory */ 30*740d5d34SSimon Glass CPU_FEAT_UCODE = 2, /* Requires/uses microcode */ 31*740d5d34SSimon Glass CPU_FEAT_DEVICE_ID = 3, /* Provides a device ID */ 3211f4dc15SSimon Glass 3311f4dc15SSimon Glass CPU_FEAT_COUNT, 3411f4dc15SSimon Glass }; 3511f4dc15SSimon Glass 3611f4dc15SSimon Glass /** 3711f4dc15SSimon Glass * struct cpu_info - Information about a CPU 3811f4dc15SSimon Glass * 3911f4dc15SSimon Glass * @cpu_freq: Current CPU frequency in Hz 4011f4dc15SSimon Glass * @features: Flags for supported CPU features 4111f4dc15SSimon Glass */ 4211f4dc15SSimon Glass struct cpu_info { 4311f4dc15SSimon Glass ulong cpu_freq; 4411f4dc15SSimon Glass ulong features; 4511f4dc15SSimon Glass }; 4611f4dc15SSimon Glass 4711f4dc15SSimon Glass struct cpu_ops { 4811f4dc15SSimon Glass /** 4911f4dc15SSimon Glass * get_desc() - Get a description string for a CPU 5011f4dc15SSimon Glass * 5111f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 5211f4dc15SSimon Glass * @buf: Buffer to place string 5311f4dc15SSimon Glass * @size: Size of string space 5411f4dc15SSimon Glass * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 5511f4dc15SSimon Glass */ 5611f4dc15SSimon Glass int (*get_desc)(struct udevice *dev, char *buf, int size); 5711f4dc15SSimon Glass 5811f4dc15SSimon Glass /** 5911f4dc15SSimon Glass * get_info() - Get information about a CPU 6011f4dc15SSimon Glass * 6111f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 6211f4dc15SSimon Glass * @info: Returns CPU info 6311f4dc15SSimon Glass * @return 0 if OK, -ve on error 6411f4dc15SSimon Glass */ 6511f4dc15SSimon Glass int (*get_info)(struct udevice *dev, struct cpu_info *info); 66780bfdd3SBin Meng 67780bfdd3SBin Meng /** 68780bfdd3SBin Meng * get_count() - Get number of CPUs 69780bfdd3SBin Meng * 70780bfdd3SBin Meng * @dev: Device to check (UCLASS_CPU) 71780bfdd3SBin Meng * @return CPU count if OK, -ve on error 72780bfdd3SBin Meng */ 73780bfdd3SBin Meng int (*get_count)(struct udevice *dev); 7411f4dc15SSimon Glass }; 7511f4dc15SSimon Glass 7611f4dc15SSimon Glass #define cpu_get_ops(dev) ((struct cpu_ops *)(dev)->driver->ops) 7711f4dc15SSimon Glass 7811f4dc15SSimon Glass /** 7911f4dc15SSimon Glass * cpu_get_desc() - Get a description string for a CPU 8011f4dc15SSimon Glass * 8111f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 8211f4dc15SSimon Glass * @buf: Buffer to place string 8311f4dc15SSimon Glass * @size: Size of string space 8411f4dc15SSimon Glass * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 8511f4dc15SSimon Glass */ 8611f4dc15SSimon Glass int cpu_get_desc(struct udevice *dev, char *buf, int size); 8711f4dc15SSimon Glass 8811f4dc15SSimon Glass /** 8911f4dc15SSimon Glass * cpu_get_info() - Get information about a CPU 9011f4dc15SSimon Glass * 9111f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 9211f4dc15SSimon Glass * @info: Returns CPU info 9311f4dc15SSimon Glass * @return 0 if OK, -ve on error 9411f4dc15SSimon Glass */ 9511f4dc15SSimon Glass int cpu_get_info(struct udevice *dev, struct cpu_info *info); 9611f4dc15SSimon Glass 97780bfdd3SBin Meng /** 98780bfdd3SBin Meng * cpu_get_count() - Get number of CPUs 99780bfdd3SBin Meng * 100780bfdd3SBin Meng * @dev: Device to check (UCLASS_CPU) 101780bfdd3SBin Meng * @return CPU count if OK, -ve on error 102780bfdd3SBin Meng */ 103780bfdd3SBin Meng int cpu_get_count(struct udevice *dev); 104780bfdd3SBin Meng 10511f4dc15SSimon Glass #endif 106