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_drv.h (14660B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * RapidIO driver services
      4 *
      5 * Copyright 2005 MontaVista Software, Inc.
      6 * Matt Porter <mporter@kernel.crashing.org>
      7 */
      8
      9#ifndef LINUX_RIO_DRV_H
     10#define LINUX_RIO_DRV_H
     11
     12#include <linux/types.h>
     13#include <linux/ioport.h>
     14#include <linux/list.h>
     15#include <linux/errno.h>
     16#include <linux/string.h>
     17#include <linux/rio.h>
     18
     19extern int __rio_local_read_config_32(struct rio_mport *port, u32 offset,
     20				      u32 * data);
     21extern int __rio_local_write_config_32(struct rio_mport *port, u32 offset,
     22				       u32 data);
     23extern int __rio_local_read_config_16(struct rio_mport *port, u32 offset,
     24				      u16 * data);
     25extern int __rio_local_write_config_16(struct rio_mport *port, u32 offset,
     26				       u16 data);
     27extern int __rio_local_read_config_8(struct rio_mport *port, u32 offset,
     28				     u8 * data);
     29extern int __rio_local_write_config_8(struct rio_mport *port, u32 offset,
     30				      u8 data);
     31
     32extern int rio_mport_read_config_32(struct rio_mport *port, u16 destid,
     33				    u8 hopcount, u32 offset, u32 * data);
     34extern int rio_mport_write_config_32(struct rio_mport *port, u16 destid,
     35				     u8 hopcount, u32 offset, u32 data);
     36extern int rio_mport_read_config_16(struct rio_mport *port, u16 destid,
     37				    u8 hopcount, u32 offset, u16 * data);
     38extern int rio_mport_write_config_16(struct rio_mport *port, u16 destid,
     39				     u8 hopcount, u32 offset, u16 data);
     40extern int rio_mport_read_config_8(struct rio_mport *port, u16 destid,
     41				   u8 hopcount, u32 offset, u8 * data);
     42extern int rio_mport_write_config_8(struct rio_mport *port, u16 destid,
     43				    u8 hopcount, u32 offset, u8 data);
     44
     45/**
     46 * rio_local_read_config_32 - Read 32 bits from local configuration space
     47 * @port: Master port
     48 * @offset: Offset into local configuration space
     49 * @data: Pointer to read data into
     50 *
     51 * Reads 32 bits of data from the specified offset within the local
     52 * device's configuration space.
     53 */
     54static inline int rio_local_read_config_32(struct rio_mport *port, u32 offset,
     55					   u32 * data)
     56{
     57	return __rio_local_read_config_32(port, offset, data);
     58}
     59
     60/**
     61 * rio_local_write_config_32 - Write 32 bits to local configuration space
     62 * @port: Master port
     63 * @offset: Offset into local configuration space
     64 * @data: Data to be written
     65 *
     66 * Writes 32 bits of data to the specified offset within the local
     67 * device's configuration space.
     68 */
     69static inline int rio_local_write_config_32(struct rio_mport *port, u32 offset,
     70					    u32 data)
     71{
     72	return __rio_local_write_config_32(port, offset, data);
     73}
     74
     75/**
     76 * rio_local_read_config_16 - Read 16 bits from local configuration space
     77 * @port: Master port
     78 * @offset: Offset into local configuration space
     79 * @data: Pointer to read data into
     80 *
     81 * Reads 16 bits of data from the specified offset within the local
     82 * device's configuration space.
     83 */
     84static inline int rio_local_read_config_16(struct rio_mport *port, u32 offset,
     85					   u16 * data)
     86{
     87	return __rio_local_read_config_16(port, offset, data);
     88}
     89
     90/**
     91 * rio_local_write_config_16 - Write 16 bits to local configuration space
     92 * @port: Master port
     93 * @offset: Offset into local configuration space
     94 * @data: Data to be written
     95 *
     96 * Writes 16 bits of data to the specified offset within the local
     97 * device's configuration space.
     98 */
     99
    100static inline int rio_local_write_config_16(struct rio_mport *port, u32 offset,
    101					    u16 data)
    102{
    103	return __rio_local_write_config_16(port, offset, data);
    104}
    105
    106/**
    107 * rio_local_read_config_8 - Read 8 bits from local configuration space
    108 * @port: Master port
    109 * @offset: Offset into local configuration space
    110 * @data: Pointer to read data into
    111 *
    112 * Reads 8 bits of data from the specified offset within the local
    113 * device's configuration space.
    114 */
    115static inline int rio_local_read_config_8(struct rio_mport *port, u32 offset,
    116					  u8 * data)
    117{
    118	return __rio_local_read_config_8(port, offset, data);
    119}
    120
    121/**
    122 * rio_local_write_config_8 - Write 8 bits to local configuration space
    123 * @port: Master port
    124 * @offset: Offset into local configuration space
    125 * @data: Data to be written
    126 *
    127 * Writes 8 bits of data to the specified offset within the local
    128 * device's configuration space.
    129 */
    130static inline int rio_local_write_config_8(struct rio_mport *port, u32 offset,
    131					   u8 data)
    132{
    133	return __rio_local_write_config_8(port, offset, data);
    134}
    135
    136/**
    137 * rio_read_config_32 - Read 32 bits from configuration space
    138 * @rdev: RIO device
    139 * @offset: Offset into device configuration space
    140 * @data: Pointer to read data into
    141 *
    142 * Reads 32 bits of data from the specified offset within the
    143 * RIO device's configuration space.
    144 */
    145static inline int rio_read_config_32(struct rio_dev *rdev, u32 offset,
    146				     u32 * data)
    147{
    148	return rio_mport_read_config_32(rdev->net->hport, rdev->destid,
    149					rdev->hopcount, offset, data);
    150};
    151
    152/**
    153 * rio_write_config_32 - Write 32 bits to configuration space
    154 * @rdev: RIO device
    155 * @offset: Offset into device configuration space
    156 * @data: Data to be written
    157 *
    158 * Writes 32 bits of data to the specified offset within the
    159 * RIO device's configuration space.
    160 */
    161static inline int rio_write_config_32(struct rio_dev *rdev, u32 offset,
    162				      u32 data)
    163{
    164	return rio_mport_write_config_32(rdev->net->hport, rdev->destid,
    165					 rdev->hopcount, offset, data);
    166};
    167
    168/**
    169 * rio_read_config_16 - Read 16 bits from configuration space
    170 * @rdev: RIO device
    171 * @offset: Offset into device configuration space
    172 * @data: Pointer to read data into
    173 *
    174 * Reads 16 bits of data from the specified offset within the
    175 * RIO device's configuration space.
    176 */
    177static inline int rio_read_config_16(struct rio_dev *rdev, u32 offset,
    178				     u16 * data)
    179{
    180	return rio_mport_read_config_16(rdev->net->hport, rdev->destid,
    181					rdev->hopcount, offset, data);
    182};
    183
    184/**
    185 * rio_write_config_16 - Write 16 bits to configuration space
    186 * @rdev: RIO device
    187 * @offset: Offset into device configuration space
    188 * @data: Data to be written
    189 *
    190 * Writes 16 bits of data to the specified offset within the
    191 * RIO device's configuration space.
    192 */
    193static inline int rio_write_config_16(struct rio_dev *rdev, u32 offset,
    194				      u16 data)
    195{
    196	return rio_mport_write_config_16(rdev->net->hport, rdev->destid,
    197					 rdev->hopcount, offset, data);
    198};
    199
    200/**
    201 * rio_read_config_8 - Read 8 bits from configuration space
    202 * @rdev: RIO device
    203 * @offset: Offset into device configuration space
    204 * @data: Pointer to read data into
    205 *
    206 * Reads 8 bits of data from the specified offset within the
    207 * RIO device's configuration space.
    208 */
    209static inline int rio_read_config_8(struct rio_dev *rdev, u32 offset, u8 * data)
    210{
    211	return rio_mport_read_config_8(rdev->net->hport, rdev->destid,
    212				       rdev->hopcount, offset, data);
    213};
    214
    215/**
    216 * rio_write_config_8 - Write 8 bits to configuration space
    217 * @rdev: RIO device
    218 * @offset: Offset into device configuration space
    219 * @data: Data to be written
    220 *
    221 * Writes 8 bits of data to the specified offset within the
    222 * RIO device's configuration space.
    223 */
    224static inline int rio_write_config_8(struct rio_dev *rdev, u32 offset, u8 data)
    225{
    226	return rio_mport_write_config_8(rdev->net->hport, rdev->destid,
    227					rdev->hopcount, offset, data);
    228};
    229
    230extern int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid,
    231				   u16 data);
    232
    233/**
    234 * rio_send_doorbell - Send a doorbell message to a device
    235 * @rdev: RIO device
    236 * @data: Doorbell message data
    237 *
    238 * Send a doorbell message to a RIO device. The doorbell message
    239 * has a 16-bit info field provided by the @data argument.
    240 */
    241static inline int rio_send_doorbell(struct rio_dev *rdev, u16 data)
    242{
    243	return rio_mport_send_doorbell(rdev->net->hport, rdev->destid, data);
    244};
    245
    246/**
    247 * rio_init_mbox_res - Initialize a RIO mailbox resource
    248 * @res: resource struct
    249 * @start: start of mailbox range
    250 * @end: end of mailbox range
    251 *
    252 * This function is used to initialize the fields of a resource
    253 * for use as a mailbox resource.  It initializes a range of
    254 * mailboxes using the start and end arguments.
    255 */
    256static inline void rio_init_mbox_res(struct resource *res, int start, int end)
    257{
    258	memset(res, 0, sizeof(struct resource));
    259	res->start = start;
    260	res->end = end;
    261	res->flags = RIO_RESOURCE_MAILBOX;
    262}
    263
    264/**
    265 * rio_init_dbell_res - Initialize a RIO doorbell resource
    266 * @res: resource struct
    267 * @start: start of doorbell range
    268 * @end: end of doorbell range
    269 *
    270 * This function is used to initialize the fields of a resource
    271 * for use as a doorbell resource.  It initializes a range of
    272 * doorbell messages using the start and end arguments.
    273 */
    274static inline void rio_init_dbell_res(struct resource *res, u16 start, u16 end)
    275{
    276	memset(res, 0, sizeof(struct resource));
    277	res->start = start;
    278	res->end = end;
    279	res->flags = RIO_RESOURCE_DOORBELL;
    280}
    281
    282/**
    283 * RIO_DEVICE - macro used to describe a specific RIO device
    284 * @dev: the 16 bit RIO device ID
    285 * @ven: the 16 bit RIO vendor ID
    286 *
    287 * This macro is used to create a struct rio_device_id that matches a
    288 * specific device.  The assembly vendor and assembly device fields
    289 * will be set to %RIO_ANY_ID.
    290 */
    291#define RIO_DEVICE(dev,ven) \
    292	.did = (dev), .vid = (ven), \
    293	.asm_did = RIO_ANY_ID, .asm_vid = RIO_ANY_ID
    294
    295/* Mailbox management */
    296extern int rio_request_outb_mbox(struct rio_mport *, void *, int, int,
    297				 void (*)(struct rio_mport *, void *,int, int));
    298extern int rio_release_outb_mbox(struct rio_mport *, int);
    299
    300/**
    301 * rio_add_outb_message - Add RIO message to an outbound mailbox queue
    302 * @mport: RIO master port containing the outbound queue
    303 * @rdev: RIO device the message is be sent to
    304 * @mbox: The outbound mailbox queue
    305 * @buffer: Pointer to the message buffer
    306 * @len: Length of the message buffer
    307 *
    308 * Adds a RIO message buffer to an outbound mailbox queue for
    309 * transmission. Returns 0 on success.
    310 */
    311static inline int rio_add_outb_message(struct rio_mport *mport,
    312				       struct rio_dev *rdev, int mbox,
    313				       void *buffer, size_t len)
    314{
    315	return mport->ops->add_outb_message(mport, rdev, mbox,
    316						   buffer, len);
    317}
    318
    319extern int rio_request_inb_mbox(struct rio_mport *, void *, int, int,
    320				void (*)(struct rio_mport *, void *, int, int));
    321extern int rio_release_inb_mbox(struct rio_mport *, int);
    322
    323/**
    324 * rio_add_inb_buffer - Add buffer to an inbound mailbox queue
    325 * @mport: Master port containing the inbound mailbox
    326 * @mbox: The inbound mailbox number
    327 * @buffer: Pointer to the message buffer
    328 *
    329 * Adds a buffer to an inbound mailbox queue for reception. Returns
    330 * 0 on success.
    331 */
    332static inline int rio_add_inb_buffer(struct rio_mport *mport, int mbox,
    333				     void *buffer)
    334{
    335	return mport->ops->add_inb_buffer(mport, mbox, buffer);
    336}
    337
    338/**
    339 * rio_get_inb_message - Get A RIO message from an inbound mailbox queue
    340 * @mport: Master port containing the inbound mailbox
    341 * @mbox: The inbound mailbox number
    342 *
    343 * Get a RIO message from an inbound mailbox queue. Returns 0 on success.
    344 */
    345static inline void *rio_get_inb_message(struct rio_mport *mport, int mbox)
    346{
    347	return mport->ops->get_inb_message(mport, mbox);
    348}
    349
    350/* Doorbell management */
    351extern int rio_request_inb_dbell(struct rio_mport *, void *, u16, u16,
    352				 void (*)(struct rio_mport *, void *, u16, u16, u16));
    353extern int rio_release_inb_dbell(struct rio_mport *, u16, u16);
    354extern struct resource *rio_request_outb_dbell(struct rio_dev *, u16, u16);
    355extern int rio_release_outb_dbell(struct rio_dev *, struct resource *);
    356
    357/* Memory region management */
    358int rio_claim_resource(struct rio_dev *, int);
    359int rio_request_regions(struct rio_dev *, char *);
    360void rio_release_regions(struct rio_dev *);
    361int rio_request_region(struct rio_dev *, int, char *);
    362void rio_release_region(struct rio_dev *, int);
    363
    364/* Memory mapping functions */
    365extern int rio_map_inb_region(struct rio_mport *mport, dma_addr_t local,
    366			u64 rbase, u32 size, u32 rflags);
    367extern void rio_unmap_inb_region(struct rio_mport *mport, dma_addr_t lstart);
    368extern int rio_map_outb_region(struct rio_mport *mport, u16 destid, u64 rbase,
    369			u32 size, u32 rflags, dma_addr_t *local);
    370extern void rio_unmap_outb_region(struct rio_mport *mport,
    371				  u16 destid, u64 rstart);
    372
    373/* Port-Write management */
    374extern int rio_request_inb_pwrite(struct rio_dev *,
    375			int (*)(struct rio_dev *, union rio_pw_msg*, int));
    376extern int rio_release_inb_pwrite(struct rio_dev *);
    377extern int rio_add_mport_pw_handler(struct rio_mport *mport, void *dev_id,
    378			int (*pwcback)(struct rio_mport *mport, void *dev_id,
    379			union rio_pw_msg *msg, int step));
    380extern int rio_del_mport_pw_handler(struct rio_mport *mport, void *dev_id,
    381			int (*pwcback)(struct rio_mport *mport, void *dev_id,
    382			union rio_pw_msg *msg, int step));
    383extern int rio_inb_pwrite_handler(struct rio_mport *mport,
    384				  union rio_pw_msg *pw_msg);
    385extern void rio_pw_enable(struct rio_mport *mport, int enable);
    386
    387/* LDM support */
    388int rio_register_driver(struct rio_driver *);
    389void rio_unregister_driver(struct rio_driver *);
    390struct rio_dev *rio_dev_get(struct rio_dev *);
    391void rio_dev_put(struct rio_dev *);
    392
    393#ifdef CONFIG_RAPIDIO_DMA_ENGINE
    394extern struct dma_chan *rio_request_dma(struct rio_dev *rdev);
    395extern struct dma_chan *rio_request_mport_dma(struct rio_mport *mport);
    396extern void rio_release_dma(struct dma_chan *dchan);
    397extern struct dma_async_tx_descriptor *rio_dma_prep_slave_sg(
    398		struct rio_dev *rdev, struct dma_chan *dchan,
    399		struct rio_dma_data *data,
    400		enum dma_transfer_direction direction, unsigned long flags);
    401extern struct dma_async_tx_descriptor *rio_dma_prep_xfer(
    402		struct dma_chan *dchan,	u16 destid,
    403		struct rio_dma_data *data,
    404		enum dma_transfer_direction direction, unsigned long flags);
    405#endif
    406
    407/**
    408 * rio_name - Get the unique RIO device identifier
    409 * @rdev: RIO device
    410 *
    411 * Get the unique RIO device identifier. Returns the device
    412 * identifier string.
    413 */
    414static inline const char *rio_name(struct rio_dev *rdev)
    415{
    416	return dev_name(&rdev->dev);
    417}
    418
    419/**
    420 * rio_get_drvdata - Get RIO driver specific data
    421 * @rdev: RIO device
    422 *
    423 * Get RIO driver specific data. Returns a pointer to the
    424 * driver specific data.
    425 */
    426static inline void *rio_get_drvdata(struct rio_dev *rdev)
    427{
    428	return dev_get_drvdata(&rdev->dev);
    429}
    430
    431/**
    432 * rio_set_drvdata - Set RIO driver specific data
    433 * @rdev: RIO device
    434 * @data: Pointer to driver specific data
    435 *
    436 * Set RIO driver specific data. device struct driver data pointer
    437 * is set to the @data argument.
    438 */
    439static inline void rio_set_drvdata(struct rio_dev *rdev, void *data)
    440{
    441	dev_set_drvdata(&rdev->dev, data);
    442}
    443
    444/* Misc driver helpers */
    445extern u16 rio_local_get_device_id(struct rio_mport *port);
    446extern void rio_local_set_device_id(struct rio_mport *port, u16 did);
    447extern int rio_init_mports(void);
    448
    449#endif				/* LINUX_RIO_DRV_H */