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