mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.2 KiB
112 lines
3.2 KiB
/* 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 */
|
|
|