cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

peci.h (3231B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/* Copyright (c) 2018-2021 Intel Corporation */
      3
      4#ifndef __LINUX_PECI_H
      5#define __LINUX_PECI_H
      6
      7#include <linux/device.h>
      8#include <linux/kernel.h>
      9#include <linux/mutex.h>
     10#include <linux/types.h>
     11
     12/*
     13 * Currently we don't support any PECI command over 32 bytes.
     14 */
     15#define PECI_REQUEST_MAX_BUF_SIZE 32
     16
     17struct peci_controller;
     18struct peci_request;
     19
     20/**
     21 * struct peci_controller_ops - PECI controller specific methods
     22 * @xfer: PECI transfer function
     23 *
     24 * PECI controllers may have different hardware interfaces - the drivers
     25 * implementing PECI controllers can use this structure to abstract away those
     26 * differences by exposing a common interface for PECI core.
     27 */
     28struct peci_controller_ops {
     29	int (*xfer)(struct peci_controller *controller, u8 addr, struct peci_request *req);
     30};
     31
     32/**
     33 * struct peci_controller - PECI controller
     34 * @dev: device object to register PECI controller to the device model
     35 * @ops: pointer to device specific controller operations
     36 * @bus_lock: lock used to protect multiple callers
     37 * @id: PECI controller ID
     38 *
     39 * PECI controllers usually connect to their drivers using non-PECI bus,
     40 * such as the platform bus.
     41 * Each PECI controller can communicate with one or more PECI devices.
     42 */
     43struct peci_controller {
     44	struct device dev;
     45	struct peci_controller_ops *ops;
     46	struct mutex bus_lock; /* held for the duration of xfer */
     47	u8 id;
     48};
     49
     50struct peci_controller *devm_peci_controller_add(struct device *parent,
     51						 struct peci_controller_ops *ops);
     52
     53static inline struct peci_controller *to_peci_controller(void *d)
     54{
     55	return container_of(d, struct peci_controller, dev);
     56}
     57
     58/**
     59 * struct peci_device - PECI device
     60 * @dev: device object to register PECI device to the device model
     61 * @controller: manages the bus segment hosting this PECI device
     62 * @info: PECI device characteristics
     63 * @info.family: device family
     64 * @info.model: device model
     65 * @info.peci_revision: PECI revision supported by the PECI device
     66 * @info.socket_id: the socket ID represented by the PECI device
     67 * @addr: address used on the PECI bus connected to the parent controller
     68 * @deleted: indicates that PECI device was already deleted
     69 *
     70 * A peci_device identifies a single device (i.e. CPU) connected to a PECI bus.
     71 * The behaviour exposed to the rest of the system is defined by the PECI driver
     72 * managing the device.
     73 */
     74struct peci_device {
     75	struct device dev;
     76	struct {
     77		u16 family;
     78		u8 model;
     79		u8 peci_revision;
     80		u8 socket_id;
     81	} info;
     82	u8 addr;
     83	bool deleted;
     84};
     85
     86static inline struct peci_device *to_peci_device(struct device *d)
     87{
     88	return container_of(d, struct peci_device, dev);
     89}
     90
     91/**
     92 * struct peci_request - PECI request
     93 * @device: PECI device to which the request is sent
     94 * @tx: TX buffer specific data
     95 * @tx.buf: TX buffer
     96 * @tx.len: transfer data length in bytes
     97 * @rx: RX buffer specific data
     98 * @rx.buf: RX buffer
     99 * @rx.len: received data length in bytes
    100 *
    101 * A peci_request represents a request issued by PECI originator (TX) and
    102 * a response received from PECI responder (RX).
    103 */
    104struct peci_request {
    105	struct peci_device *device;
    106	struct {
    107		u8 buf[PECI_REQUEST_MAX_BUF_SIZE];
    108		u8 len;
    109	} rx, tx;
    110};
    111
    112#endif /* __LINUX_PECI_H */