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 Winiarskastatic 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 Winiarskastatic 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