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 */