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

transport_class.h (2574B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * transport_class.h - a generic container for all transport classes
      4 *
      5 * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com>
      6 */
      7
      8#ifndef _TRANSPORT_CLASS_H_
      9#define _TRANSPORT_CLASS_H_
     10
     11#include <linux/device.h>
     12#include <linux/bug.h>
     13#include <linux/attribute_container.h>
     14
     15struct transport_container;
     16
     17struct transport_class {
     18	struct class class;
     19	int (*setup)(struct transport_container *, struct device *,
     20		     struct device *);
     21	int (*configure)(struct transport_container *, struct device *,
     22			 struct device *);
     23	int (*remove)(struct transport_container *, struct device *,
     24		      struct device *);
     25};
     26
     27#define DECLARE_TRANSPORT_CLASS(cls, nm, su, rm, cfg)			\
     28struct transport_class cls = {						\
     29	.class = {							\
     30		.name = nm,						\
     31	},								\
     32	.setup = su,							\
     33	.remove = rm,							\
     34	.configure = cfg,						\
     35}
     36
     37
     38struct anon_transport_class {
     39	struct transport_class tclass;
     40	struct attribute_container container;
     41};
     42
     43#define DECLARE_ANON_TRANSPORT_CLASS(cls, mtch, cfg)		\
     44struct anon_transport_class cls = {				\
     45	.tclass = {						\
     46		.configure = cfg,				\
     47	},							\
     48	. container = {						\
     49		.match = mtch,					\
     50	},							\
     51}
     52
     53#define class_to_transport_class(x) \
     54	container_of(x, struct transport_class, class)
     55
     56struct transport_container {
     57	struct attribute_container ac;
     58	const struct attribute_group *statistics;
     59};
     60
     61#define attribute_container_to_transport_container(x) \
     62	container_of(x, struct transport_container, ac)
     63
     64void transport_remove_device(struct device *);
     65int transport_add_device(struct device *);
     66void transport_setup_device(struct device *);
     67void transport_configure_device(struct device *);
     68void transport_destroy_device(struct device *);
     69
     70static inline int
     71transport_register_device(struct device *dev)
     72{
     73	transport_setup_device(dev);
     74	return transport_add_device(dev);
     75}
     76
     77static inline void
     78transport_unregister_device(struct device *dev)
     79{
     80	transport_remove_device(dev);
     81	transport_destroy_device(dev);
     82}
     83
     84static inline int transport_container_register(struct transport_container *tc)
     85{
     86	return attribute_container_register(&tc->ac);
     87}
     88
     89static inline void transport_container_unregister(struct transport_container *tc)
     90{
     91	if (unlikely(attribute_container_unregister(&tc->ac)))
     92		BUG();
     93}
     94
     95int transport_class_register(struct transport_class *);
     96int anon_transport_class_register(struct anon_transport_class *);
     97void transport_class_unregister(struct transport_class *);
     98void anon_transport_class_unregister(struct anon_transport_class *);
     99
    100
    101#endif