xref: /linux-6.15/include/linux/peci.h (revision a43b9ec0)
16523d3b2SIwona Winiarska /* SPDX-License-Identifier: GPL-2.0-only */
26523d3b2SIwona Winiarska /* Copyright (c) 2018-2021 Intel Corporation */
36523d3b2SIwona Winiarska 
46523d3b2SIwona Winiarska #ifndef __LINUX_PECI_H
56523d3b2SIwona Winiarska #define __LINUX_PECI_H
66523d3b2SIwona Winiarska 
76523d3b2SIwona Winiarska #include <linux/device.h>
86523d3b2SIwona Winiarska #include <linux/kernel.h>
96523d3b2SIwona Winiarska #include <linux/mutex.h>
106523d3b2SIwona Winiarska #include <linux/types.h>
116523d3b2SIwona Winiarska 
126523d3b2SIwona Winiarska /*
136523d3b2SIwona Winiarska  * Currently we don't support any PECI command over 32 bytes.
146523d3b2SIwona Winiarska  */
156523d3b2SIwona Winiarska #define PECI_REQUEST_MAX_BUF_SIZE 32
166523d3b2SIwona Winiarska 
176523d3b2SIwona Winiarska struct peci_controller;
186523d3b2SIwona Winiarska struct peci_request;
196523d3b2SIwona Winiarska 
206523d3b2SIwona Winiarska /**
216523d3b2SIwona Winiarska  * struct peci_controller_ops - PECI controller specific methods
226523d3b2SIwona Winiarska  * @xfer: PECI transfer function
236523d3b2SIwona Winiarska  *
246523d3b2SIwona Winiarska  * PECI controllers may have different hardware interfaces - the drivers
256523d3b2SIwona Winiarska  * implementing PECI controllers can use this structure to abstract away those
266523d3b2SIwona Winiarska  * differences by exposing a common interface for PECI core.
276523d3b2SIwona Winiarska  */
286523d3b2SIwona Winiarska struct peci_controller_ops {
296523d3b2SIwona Winiarska 	int (*xfer)(struct peci_controller *controller, u8 addr, struct peci_request *req);
306523d3b2SIwona Winiarska };
316523d3b2SIwona Winiarska 
326523d3b2SIwona Winiarska /**
336523d3b2SIwona Winiarska  * struct peci_controller - PECI controller
346523d3b2SIwona Winiarska  * @dev: device object to register PECI controller to the device model
356523d3b2SIwona Winiarska  * @ops: pointer to device specific controller operations
366523d3b2SIwona Winiarska  * @bus_lock: lock used to protect multiple callers
376523d3b2SIwona Winiarska  * @id: PECI controller ID
386523d3b2SIwona Winiarska  *
396523d3b2SIwona Winiarska  * PECI controllers usually connect to their drivers using non-PECI bus,
406523d3b2SIwona Winiarska  * such as the platform bus.
416523d3b2SIwona Winiarska  * Each PECI controller can communicate with one or more PECI devices.
426523d3b2SIwona Winiarska  */
436523d3b2SIwona Winiarska struct peci_controller {
446523d3b2SIwona Winiarska 	struct device dev;
458306d6f3SZev Weiss 	const struct peci_controller_ops *ops;
466523d3b2SIwona Winiarska 	struct mutex bus_lock; /* held for the duration of xfer */
476523d3b2SIwona Winiarska 	u8 id;
486523d3b2SIwona Winiarska };
496523d3b2SIwona Winiarska 
506523d3b2SIwona Winiarska struct peci_controller *devm_peci_controller_add(struct device *parent,
518306d6f3SZev Weiss 						 const struct peci_controller_ops *ops);
526523d3b2SIwona Winiarska 
to_peci_controller(void * d)536523d3b2SIwona Winiarska static inline struct peci_controller *to_peci_controller(void *d)
546523d3b2SIwona Winiarska {
556523d3b2SIwona Winiarska 	return container_of(d, struct peci_controller, dev);
566523d3b2SIwona Winiarska }
576523d3b2SIwona Winiarska 
586523d3b2SIwona Winiarska /**
596523d3b2SIwona Winiarska  * struct peci_device - PECI device
606523d3b2SIwona Winiarska  * @dev: device object to register PECI device to the device model
616b8145b0SIwona Winiarska  * @info: PECI device characteristics
62*a43b9ec0STony Luck  * @info.x86_vfm: device vendor-family-model
636b8145b0SIwona Winiarska  * @info.peci_revision: PECI revision supported by the PECI device
646b8145b0SIwona Winiarska  * @info.socket_id: the socket ID represented by the PECI device
656523d3b2SIwona Winiarska  * @addr: address used on the PECI bus connected to the parent controller
6652857e68SIwona Winiarska  * @deleted: indicates that PECI device was already deleted
676523d3b2SIwona Winiarska  *
686523d3b2SIwona Winiarska  * A peci_device identifies a single device (i.e. CPU) connected to a PECI bus.
696523d3b2SIwona Winiarska  * The behaviour exposed to the rest of the system is defined by the PECI driver
706523d3b2SIwona Winiarska  * managing the device.
716523d3b2SIwona Winiarska  */
726523d3b2SIwona Winiarska struct peci_device {
736523d3b2SIwona Winiarska 	struct device dev;
746b8145b0SIwona Winiarska 	struct {
75*a43b9ec0STony Luck 		u32 x86_vfm;
766b8145b0SIwona Winiarska 		u8 peci_revision;
776b8145b0SIwona Winiarska 		u8 socket_id;
786b8145b0SIwona Winiarska 	} info;
796523d3b2SIwona Winiarska 	u8 addr;
8052857e68SIwona Winiarska 	bool deleted;
816523d3b2SIwona Winiarska };
826523d3b2SIwona Winiarska 
to_peci_device(struct device * d)836523d3b2SIwona Winiarska static inline struct peci_device *to_peci_device(struct device *d)
846523d3b2SIwona Winiarska {
856523d3b2SIwona Winiarska 	return container_of(d, struct peci_device, dev);
866523d3b2SIwona Winiarska }
876523d3b2SIwona Winiarska 
886523d3b2SIwona Winiarska /**
896523d3b2SIwona Winiarska  * struct peci_request - PECI request
906523d3b2SIwona Winiarska  * @device: PECI device to which the request is sent
916523d3b2SIwona Winiarska  * @tx: TX buffer specific data
926523d3b2SIwona Winiarska  * @tx.buf: TX buffer
936523d3b2SIwona Winiarska  * @tx.len: transfer data length in bytes
946523d3b2SIwona Winiarska  * @rx: RX buffer specific data
956523d3b2SIwona Winiarska  * @rx.buf: RX buffer
966523d3b2SIwona Winiarska  * @rx.len: received data length in bytes
976523d3b2SIwona Winiarska  *
986523d3b2SIwona Winiarska  * A peci_request represents a request issued by PECI originator (TX) and
996523d3b2SIwona Winiarska  * a response received from PECI responder (RX).
1006523d3b2SIwona Winiarska  */
1016523d3b2SIwona Winiarska struct peci_request {
1026523d3b2SIwona Winiarska 	struct peci_device *device;
1036523d3b2SIwona Winiarska 	struct {
1046523d3b2SIwona Winiarska 		u8 buf[PECI_REQUEST_MAX_BUF_SIZE];
1056523d3b2SIwona Winiarska 		u8 len;
1066523d3b2SIwona Winiarska 	} rx, tx;
1076523d3b2SIwona Winiarska };
1086523d3b2SIwona Winiarska 
1096523d3b2SIwona Winiarska #endif /* __LINUX_PECI_H */
110