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. 18740d5d34SSimon Glass * @ucode_version: Microcode version, if CPU_FEAT_UCODE is set 1911f4dc15SSimon Glass */ 2011f4dc15SSimon Glass struct cpu_platdata { 2111f4dc15SSimon Glass int cpu_id; 22740d5d34SSimon Glass int ucode_version; 23740d5d34SSimon Glass ulong device_id; 246f192ddcSAlexander Graf u16 family; /* DMTF CPU Family */ 256f192ddcSAlexander Graf u32 id[2]; /* DMTF CPU Processor IDs */ 2611f4dc15SSimon Glass }; 2711f4dc15SSimon Glass 2811f4dc15SSimon Glass /* CPU features - mostly just a placeholder for now */ 2911f4dc15SSimon Glass enum { 3011f4dc15SSimon Glass CPU_FEAT_L1_CACHE = 0, /* Supports level 1 cache */ 3111f4dc15SSimon Glass CPU_FEAT_MMU = 1, /* Supports virtual memory */ 32740d5d34SSimon Glass CPU_FEAT_UCODE = 2, /* Requires/uses microcode */ 33740d5d34SSimon Glass CPU_FEAT_DEVICE_ID = 3, /* Provides a device ID */ 3411f4dc15SSimon Glass 3511f4dc15SSimon Glass CPU_FEAT_COUNT, 3611f4dc15SSimon Glass }; 3711f4dc15SSimon Glass 3811f4dc15SSimon Glass /** 3911f4dc15SSimon Glass * struct cpu_info - Information about a CPU 4011f4dc15SSimon Glass * 4111f4dc15SSimon Glass * @cpu_freq: Current CPU frequency in Hz 4211f4dc15SSimon Glass * @features: Flags for supported CPU features 4311f4dc15SSimon Glass */ 4411f4dc15SSimon Glass struct cpu_info { 4511f4dc15SSimon Glass ulong cpu_freq; 4611f4dc15SSimon Glass ulong features; 4711f4dc15SSimon Glass }; 4811f4dc15SSimon Glass 4911f4dc15SSimon Glass struct cpu_ops { 5011f4dc15SSimon Glass /** 5111f4dc15SSimon Glass * get_desc() - Get a description string for a CPU 5211f4dc15SSimon Glass * 5311f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 5411f4dc15SSimon Glass * @buf: Buffer to place string 5511f4dc15SSimon Glass * @size: Size of string space 5611f4dc15SSimon Glass * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 5711f4dc15SSimon Glass */ 5811f4dc15SSimon Glass int (*get_desc)(struct udevice *dev, char *buf, int size); 5911f4dc15SSimon Glass 6011f4dc15SSimon Glass /** 6111f4dc15SSimon Glass * get_info() - Get information about a CPU 6211f4dc15SSimon Glass * 6311f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 6411f4dc15SSimon Glass * @info: Returns CPU info 6511f4dc15SSimon Glass * @return 0 if OK, -ve on error 6611f4dc15SSimon Glass */ 6711f4dc15SSimon Glass int (*get_info)(struct udevice *dev, struct cpu_info *info); 68780bfdd3SBin Meng 69780bfdd3SBin Meng /** 70780bfdd3SBin Meng * get_count() - Get number of CPUs 71780bfdd3SBin Meng * 72780bfdd3SBin Meng * @dev: Device to check (UCLASS_CPU) 73780bfdd3SBin Meng * @return CPU count if OK, -ve on error 74780bfdd3SBin Meng */ 75780bfdd3SBin Meng int (*get_count)(struct udevice *dev); 76*94eaa79cSAlexander Graf 77*94eaa79cSAlexander Graf /** 78*94eaa79cSAlexander Graf * get_vendor() - Get vendor name of a CPU 79*94eaa79cSAlexander Graf * 80*94eaa79cSAlexander Graf * @dev: Device to check (UCLASS_CPU) 81*94eaa79cSAlexander Graf * @buf: Buffer to place string 82*94eaa79cSAlexander Graf * @size: Size of string space 83*94eaa79cSAlexander Graf * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 84*94eaa79cSAlexander Graf */ 85*94eaa79cSAlexander Graf int (*get_vendor)(struct udevice *dev, char *buf, int size); 8611f4dc15SSimon Glass }; 8711f4dc15SSimon Glass 8811f4dc15SSimon Glass #define cpu_get_ops(dev) ((struct cpu_ops *)(dev)->driver->ops) 8911f4dc15SSimon Glass 9011f4dc15SSimon Glass /** 9111f4dc15SSimon Glass * cpu_get_desc() - Get a description string for a CPU 9211f4dc15SSimon Glass * 9311f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 9411f4dc15SSimon Glass * @buf: Buffer to place string 9511f4dc15SSimon Glass * @size: Size of string space 9611f4dc15SSimon Glass * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 9711f4dc15SSimon Glass */ 9811f4dc15SSimon Glass int cpu_get_desc(struct udevice *dev, char *buf, int size); 9911f4dc15SSimon Glass 10011f4dc15SSimon Glass /** 10111f4dc15SSimon Glass * cpu_get_info() - Get information about a CPU 10211f4dc15SSimon Glass * 10311f4dc15SSimon Glass * @dev: Device to check (UCLASS_CPU) 10411f4dc15SSimon Glass * @info: Returns CPU info 10511f4dc15SSimon Glass * @return 0 if OK, -ve on error 10611f4dc15SSimon Glass */ 10711f4dc15SSimon Glass int cpu_get_info(struct udevice *dev, struct cpu_info *info); 10811f4dc15SSimon Glass 109780bfdd3SBin Meng /** 110780bfdd3SBin Meng * cpu_get_count() - Get number of CPUs 111780bfdd3SBin Meng * 112780bfdd3SBin Meng * @dev: Device to check (UCLASS_CPU) 113780bfdd3SBin Meng * @return CPU count if OK, -ve on error 114780bfdd3SBin Meng */ 115780bfdd3SBin Meng int cpu_get_count(struct udevice *dev); 116780bfdd3SBin Meng 117*94eaa79cSAlexander Graf /** 118*94eaa79cSAlexander Graf * cpu_get_vendor() - Get vendor name of a CPU 119*94eaa79cSAlexander Graf * 120*94eaa79cSAlexander Graf * @dev: Device to check (UCLASS_CPU) 121*94eaa79cSAlexander Graf * @buf: Buffer to place string 122*94eaa79cSAlexander Graf * @size: Size of string space 123*94eaa79cSAlexander Graf * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error 124*94eaa79cSAlexander Graf */ 125*94eaa79cSAlexander Graf int cpu_get_vendor(struct udevice *dev, char *buf, int size); 126*94eaa79cSAlexander Graf 12711f4dc15SSimon Glass #endif 128