linux/drivers/rapidio/rio-access.c
<<
>>
Prefs
   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);
 144