cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

connection.h (3743B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Greybus connections
      4 *
      5 * Copyright 2014 Google Inc.
      6 * Copyright 2014 Linaro Ltd.
      7 */
      8
      9#ifndef __CONNECTION_H
     10#define __CONNECTION_H
     11
     12#include <linux/bits.h>
     13#include <linux/list.h>
     14#include <linux/kfifo.h>
     15#include <linux/kref.h>
     16#include <linux/workqueue.h>
     17
     18#define GB_CONNECTION_FLAG_CSD		BIT(0)
     19#define GB_CONNECTION_FLAG_NO_FLOWCTRL	BIT(1)
     20#define GB_CONNECTION_FLAG_OFFLOADED	BIT(2)
     21#define GB_CONNECTION_FLAG_CDSI1	BIT(3)
     22#define GB_CONNECTION_FLAG_CONTROL	BIT(4)
     23#define GB_CONNECTION_FLAG_HIGH_PRIO	BIT(5)
     24
     25#define GB_CONNECTION_FLAG_CORE_MASK	GB_CONNECTION_FLAG_CONTROL
     26
     27enum gb_connection_state {
     28	GB_CONNECTION_STATE_DISABLED		= 0,
     29	GB_CONNECTION_STATE_ENABLED_TX		= 1,
     30	GB_CONNECTION_STATE_ENABLED		= 2,
     31	GB_CONNECTION_STATE_DISCONNECTING	= 3,
     32};
     33
     34struct gb_operation;
     35
     36typedef int (*gb_request_handler_t)(struct gb_operation *);
     37
     38struct gb_connection {
     39	struct gb_host_device		*hd;
     40	struct gb_interface		*intf;
     41	struct gb_bundle		*bundle;
     42	struct kref			kref;
     43	u16				hd_cport_id;
     44	u16				intf_cport_id;
     45
     46	struct list_head		hd_links;
     47	struct list_head		bundle_links;
     48
     49	gb_request_handler_t		handler;
     50	unsigned long			flags;
     51
     52	struct mutex			mutex;
     53	spinlock_t			lock;
     54	enum gb_connection_state	state;
     55	struct list_head		operations;
     56
     57	char				name[16];
     58	struct workqueue_struct		*wq;
     59
     60	atomic_t			op_cycle;
     61
     62	void				*private;
     63
     64	bool				mode_switch;
     65};
     66
     67struct gb_connection *gb_connection_create_static(struct gb_host_device *hd,
     68				u16 hd_cport_id, gb_request_handler_t handler);
     69struct gb_connection *gb_connection_create_control(struct gb_interface *intf);
     70struct gb_connection *gb_connection_create(struct gb_bundle *bundle,
     71				u16 cport_id, gb_request_handler_t handler);
     72struct gb_connection *gb_connection_create_flags(struct gb_bundle *bundle,
     73				u16 cport_id, gb_request_handler_t handler,
     74				unsigned long flags);
     75struct gb_connection *gb_connection_create_offloaded(struct gb_bundle *bundle,
     76				u16 cport_id, unsigned long flags);
     77void gb_connection_destroy(struct gb_connection *connection);
     78
     79static inline bool gb_connection_is_static(struct gb_connection *connection)
     80{
     81	return !connection->intf;
     82}
     83
     84int gb_connection_enable(struct gb_connection *connection);
     85int gb_connection_enable_tx(struct gb_connection *connection);
     86void gb_connection_disable_rx(struct gb_connection *connection);
     87void gb_connection_disable(struct gb_connection *connection);
     88void gb_connection_disable_forced(struct gb_connection *connection);
     89
     90void gb_connection_mode_switch_prepare(struct gb_connection *connection);
     91void gb_connection_mode_switch_complete(struct gb_connection *connection);
     92
     93void greybus_data_rcvd(struct gb_host_device *hd, u16 cport_id,
     94		       u8 *data, size_t length);
     95
     96void gb_connection_latency_tag_enable(struct gb_connection *connection);
     97void gb_connection_latency_tag_disable(struct gb_connection *connection);
     98
     99static inline bool gb_connection_e2efc_enabled(struct gb_connection *connection)
    100{
    101	return !(connection->flags & GB_CONNECTION_FLAG_CSD);
    102}
    103
    104static inline bool
    105gb_connection_flow_control_disabled(struct gb_connection *connection)
    106{
    107	return connection->flags & GB_CONNECTION_FLAG_NO_FLOWCTRL;
    108}
    109
    110static inline bool gb_connection_is_offloaded(struct gb_connection *connection)
    111{
    112	return connection->flags & GB_CONNECTION_FLAG_OFFLOADED;
    113}
    114
    115static inline bool gb_connection_is_control(struct gb_connection *connection)
    116{
    117	return connection->flags & GB_CONNECTION_FLAG_CONTROL;
    118}
    119
    120static inline void *gb_connection_get_data(struct gb_connection *connection)
    121{
    122	return connection->private;
    123}
    124
    125static inline void gb_connection_set_data(struct gb_connection *connection,
    126					  void *data)
    127{
    128	connection->private = data;
    129}
    130
    131#endif /* __CONNECTION_H */