123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /* Copyright (c) 2018-2021 Intel Corporation */
- #ifndef __LINUX_PECI_H
- #define __LINUX_PECI_H
- #include <linux/device.h>
- #include <linux/kernel.h>
- #include <linux/mutex.h>
- #include <linux/types.h>
- /*
- * Currently we don't support any PECI command over 32 bytes.
- */
- #define PECI_REQUEST_MAX_BUF_SIZE 32
- struct peci_controller;
- struct peci_request;
- /**
- * struct peci_controller_ops - PECI controller specific methods
- * @xfer: PECI transfer function
- *
- * PECI controllers may have different hardware interfaces - the drivers
- * implementing PECI controllers can use this structure to abstract away those
- * differences by exposing a common interface for PECI core.
- */
- struct peci_controller_ops {
- int (*xfer)(struct peci_controller *controller, u8 addr, struct peci_request *req);
- };
- /**
- * struct peci_controller - PECI controller
- * @dev: device object to register PECI controller to the device model
- * @ops: pointer to device specific controller operations
- * @bus_lock: lock used to protect multiple callers
- * @id: PECI controller ID
- *
- * PECI controllers usually connect to their drivers using non-PECI bus,
- * such as the platform bus.
- * Each PECI controller can communicate with one or more PECI devices.
- */
- struct peci_controller {
- struct device dev;
- struct peci_controller_ops *ops;
- struct mutex bus_lock; /* held for the duration of xfer */
- u8 id;
- };
- struct peci_controller *devm_peci_controller_add(struct device *parent,
- struct peci_controller_ops *ops);
- static inline struct peci_controller *to_peci_controller(void *d)
- {
- return container_of(d, struct peci_controller, dev);
- }
- /**
- * struct peci_device - PECI device
- * @dev: device object to register PECI device to the device model
- * @controller: manages the bus segment hosting this PECI device
- * @info: PECI device characteristics
- * @info.family: device family
- * @info.model: device model
- * @info.peci_revision: PECI revision supported by the PECI device
- * @info.socket_id: the socket ID represented by the PECI device
- * @addr: address used on the PECI bus connected to the parent controller
- * @deleted: indicates that PECI device was already deleted
- *
- * A peci_device identifies a single device (i.e. CPU) connected to a PECI bus.
- * The behaviour exposed to the rest of the system is defined by the PECI driver
- * managing the device.
- */
- struct peci_device {
- struct device dev;
- struct {
- u16 family;
- u8 model;
- u8 peci_revision;
- u8 socket_id;
- } info;
- u8 addr;
- bool deleted;
- };
- static inline struct peci_device *to_peci_device(struct device *d)
- {
- return container_of(d, struct peci_device, dev);
- }
- /**
- * struct peci_request - PECI request
- * @device: PECI device to which the request is sent
- * @tx: TX buffer specific data
- * @tx.buf: TX buffer
- * @tx.len: transfer data length in bytes
- * @rx: RX buffer specific data
- * @rx.buf: RX buffer
- * @rx.len: received data length in bytes
- *
- * A peci_request represents a request issued by PECI originator (TX) and
- * a response received from PECI responder (RX).
- */
- struct peci_request {
- struct peci_device *device;
- struct {
- u8 buf[PECI_REQUEST_MAX_BUF_SIZE];
- u8 len;
- } rx, tx;
- };
- #endif /* __LINUX_PECI_H */
|