Merge branch 'address-masking'
[linux-2.6-block.git] / include / linux / peci.h
CommitLineData
6523d3b2
IW
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;
8306d6f3 45 const struct peci_controller_ops *ops;
6523d3b2
IW
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,
8306d6f3 51 const struct peci_controller_ops *ops);
6523d3b2
IW
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
6b8145b0 61 * @info: PECI device characteristics
a43b9ec0 62 * @info.x86_vfm: device vendor-family-model
6b8145b0
IW
63 * @info.peci_revision: PECI revision supported by the PECI device
64 * @info.socket_id: the socket ID represented by the PECI device
6523d3b2 65 * @addr: address used on the PECI bus connected to the parent controller
52857e68 66 * @deleted: indicates that PECI device was already deleted
6523d3b2
IW
67 *
68 * A peci_device identifies a single device (i.e. CPU) connected to a PECI bus.
69 * The behaviour exposed to the rest of the system is defined by the PECI driver
70 * managing the device.
71 */
72struct peci_device {
73 struct device dev;
6b8145b0 74 struct {
a43b9ec0 75 u32 x86_vfm;
6b8145b0
IW
76 u8 peci_revision;
77 u8 socket_id;
78 } info;
6523d3b2 79 u8 addr;
52857e68 80 bool deleted;
6523d3b2
IW
81};
82
83static inline struct peci_device *to_peci_device(struct device *d)
84{
85 return container_of(d, struct peci_device, dev);
86}
87
88/**
89 * struct peci_request - PECI request
90 * @device: PECI device to which the request is sent
91 * @tx: TX buffer specific data
92 * @tx.buf: TX buffer
93 * @tx.len: transfer data length in bytes
94 * @rx: RX buffer specific data
95 * @rx.buf: RX buffer
96 * @rx.len: received data length in bytes
97 *
98 * A peci_request represents a request issued by PECI originator (TX) and
99 * a response received from PECI responder (RX).
100 */
101struct peci_request {
102 struct peci_device *device;
103 struct {
104 u8 buf[PECI_REQUEST_MAX_BUF_SIZE];
105 u8 len;
106 } rx, tx;
107};
108
109#endif /* __LINUX_PECI_H */