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