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

rio-access.c (4524B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * RapidIO configuration space access support
      4 *
      5 * Copyright 2005 MontaVista Software, Inc.
      6 * Matt Porter <mporter@kernel.crashing.org>
      7 */
      8
      9#include <linux/rio.h>
     10#include <linux/module.h>
     11
     12#include <linux/rio_drv.h>
     13
     14/*
     15 *  Wrappers for all RIO configuration access functions.  They just check
     16 *  alignment and call the low-level functions pointed to by rio_mport->ops.
     17 */
     18
     19#define RIO_8_BAD 0
     20#define RIO_16_BAD (offset & 1)
     21#define RIO_32_BAD (offset & 3)
     22
     23/**
     24 * RIO_LOP_READ - Generate rio_local_read_config_* functions
     25 * @size: Size of configuration space read (8, 16, 32 bits)
     26 * @type: C type of value argument
     27 * @len: Length of configuration space read (1, 2, 4 bytes)
     28 *
     29 * Generates rio_local_read_config_* functions used to access
     30 * configuration space registers on the local device.
     31 */
     32#define RIO_LOP_READ(size,type,len) \
     33int __rio_local_read_config_##size \
     34	(struct rio_mport *mport, u32 offset, type *value)		\
     35{									\
     36	int res;							\
     37	u32 data = 0;							\
     38	if (RIO_##size##_BAD) return RIO_BAD_SIZE;			\
     39	res = mport->ops->lcread(mport, mport->id, offset, len, &data);	\
     40	*value = (type)data;						\
     41	return res;							\
     42}
     43
     44/**
     45 * RIO_LOP_WRITE - Generate rio_local_write_config_* functions
     46 * @size: Size of configuration space write (8, 16, 32 bits)
     47 * @type: C type of value argument
     48 * @len: Length of configuration space write (1, 2, 4 bytes)
     49 *
     50 * Generates rio_local_write_config_* functions used to access
     51 * configuration space registers on the local device.
     52 */
     53#define RIO_LOP_WRITE(size,type,len) \
     54int __rio_local_write_config_##size \
     55	(struct rio_mport *mport, u32 offset, type value)		\
     56{									\
     57	if (RIO_##size##_BAD) return RIO_BAD_SIZE;			\
     58	return mport->ops->lcwrite(mport, mport->id, offset, len, value);\
     59}
     60
     61RIO_LOP_READ(8, u8, 1)
     62RIO_LOP_READ(16, u16, 2)
     63RIO_LOP_READ(32, u32, 4)
     64RIO_LOP_WRITE(8, u8, 1)
     65RIO_LOP_WRITE(16, u16, 2)
     66RIO_LOP_WRITE(32, u32, 4)
     67
     68EXPORT_SYMBOL_GPL(__rio_local_read_config_8);
     69EXPORT_SYMBOL_GPL(__rio_local_read_config_16);
     70EXPORT_SYMBOL_GPL(__rio_local_read_config_32);
     71EXPORT_SYMBOL_GPL(__rio_local_write_config_8);
     72EXPORT_SYMBOL_GPL(__rio_local_write_config_16);
     73EXPORT_SYMBOL_GPL(__rio_local_write_config_32);
     74
     75/**
     76 * RIO_OP_READ - Generate rio_mport_read_config_* functions
     77 * @size: Size of configuration space read (8, 16, 32 bits)
     78 * @type: C type of value argument
     79 * @len: Length of configuration space read (1, 2, 4 bytes)
     80 *
     81 * Generates rio_mport_read_config_* functions used to access
     82 * configuration space registers on the local device.
     83 */
     84#define RIO_OP_READ(size,type,len) \
     85int rio_mport_read_config_##size \
     86	(struct rio_mport *mport, u16 destid, u8 hopcount, u32 offset, type *value)	\
     87{									\
     88	int res;							\
     89	u32 data = 0;							\
     90	if (RIO_##size##_BAD) return RIO_BAD_SIZE;			\
     91	res = mport->ops->cread(mport, mport->id, destid, hopcount, offset, len, &data); \
     92	*value = (type)data;						\
     93	return res;							\
     94}
     95
     96/**
     97 * RIO_OP_WRITE - Generate rio_mport_write_config_* functions
     98 * @size: Size of configuration space write (8, 16, 32 bits)
     99 * @type: C type of value argument
    100 * @len: Length of configuration space write (1, 2, 4 bytes)
    101 *
    102 * Generates rio_mport_write_config_* functions used to access
    103 * configuration space registers on the local device.
    104 */
    105#define RIO_OP_WRITE(size,type,len) \
    106int rio_mport_write_config_##size \
    107	(struct rio_mport *mport, u16 destid, u8 hopcount, u32 offset, type value)	\
    108{									\
    109	if (RIO_##size##_BAD) return RIO_BAD_SIZE;			\
    110	return mport->ops->cwrite(mport, mport->id, destid, hopcount,	\
    111			offset, len, value);				\
    112}
    113
    114RIO_OP_READ(8, u8, 1)
    115RIO_OP_READ(16, u16, 2)
    116RIO_OP_READ(32, u32, 4)
    117RIO_OP_WRITE(8, u8, 1)
    118RIO_OP_WRITE(16, u16, 2)
    119RIO_OP_WRITE(32, u32, 4)
    120
    121EXPORT_SYMBOL_GPL(rio_mport_read_config_8);
    122EXPORT_SYMBOL_GPL(rio_mport_read_config_16);
    123EXPORT_SYMBOL_GPL(rio_mport_read_config_32);
    124EXPORT_SYMBOL_GPL(rio_mport_write_config_8);
    125EXPORT_SYMBOL_GPL(rio_mport_write_config_16);
    126EXPORT_SYMBOL_GPL(rio_mport_write_config_32);
    127
    128/**
    129 * rio_mport_send_doorbell - Send a doorbell message
    130 *
    131 * @mport: RIO master port
    132 * @destid: RIO device destination ID
    133 * @data: Doorbell message data
    134 *
    135 * Send a doorbell message to a RIO device. The doorbell message
    136 * has a 16-bit info field provided by the data argument.
    137 */
    138int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid, u16 data)
    139{
    140	return mport->ops->dsend(mport, mport->id, destid, data);
    141}
    142
    143EXPORT_SYMBOL_GPL(rio_mport_send_doorbell);