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  
17  struct peci_controller;
18  struct 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   */
28  struct 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   */
43  struct peci_controller {
44  	struct device dev;
45  	const struct peci_controller_ops *ops;
46  	struct mutex bus_lock; /* held for the duration of xfer */
47  	u8 id;
48  };
49  
50  struct peci_controller *devm_peci_controller_add(struct device *parent,
51  						 const struct peci_controller_ops *ops);
52  
to_peci_controller(void * d)53  static 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   * @info: PECI device characteristics
62   * @info.x86_vfm: device vendor-family-model
63   * @info.peci_revision: PECI revision supported by the PECI device
64   * @info.socket_id: the socket ID represented by the PECI device
65   * @addr: address used on the PECI bus connected to the parent controller
66   * @deleted: indicates that PECI device was already deleted
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   */
72  struct peci_device {
73  	struct device dev;
74  	struct {
75  		u32 x86_vfm;
76  		u8 peci_revision;
77  		u8 socket_id;
78  	} info;
79  	u8 addr;
80  	bool deleted;
81  };
82  
to_peci_device(struct device * d)83  static 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   */
101  struct 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 */
110