| .. | .. |
|---|
| 43 | 43 | #endif |
|---|
| 44 | 44 | |
|---|
| 45 | 45 | struct iomap_ops { |
|---|
| 46 | | - unsigned int (*read8)(void __iomem *); |
|---|
| 47 | | - unsigned int (*read16)(void __iomem *); |
|---|
| 48 | | - unsigned int (*read16be)(void __iomem *); |
|---|
| 49 | | - unsigned int (*read32)(void __iomem *); |
|---|
| 50 | | - unsigned int (*read32be)(void __iomem *); |
|---|
| 46 | + unsigned int (*read8)(const void __iomem *); |
|---|
| 47 | + unsigned int (*read16)(const void __iomem *); |
|---|
| 48 | + unsigned int (*read16be)(const void __iomem *); |
|---|
| 49 | + unsigned int (*read32)(const void __iomem *); |
|---|
| 50 | + unsigned int (*read32be)(const void __iomem *); |
|---|
| 51 | + u64 (*read64)(const void __iomem *); |
|---|
| 52 | + u64 (*read64be)(const void __iomem *); |
|---|
| 51 | 53 | void (*write8)(u8, void __iomem *); |
|---|
| 52 | 54 | void (*write16)(u16, void __iomem *); |
|---|
| 53 | 55 | void (*write16be)(u16, void __iomem *); |
|---|
| 54 | 56 | void (*write32)(u32, void __iomem *); |
|---|
| 55 | 57 | void (*write32be)(u32, void __iomem *); |
|---|
| 56 | | - void (*read8r)(void __iomem *, void *, unsigned long); |
|---|
| 57 | | - void (*read16r)(void __iomem *, void *, unsigned long); |
|---|
| 58 | | - void (*read32r)(void __iomem *, void *, unsigned long); |
|---|
| 58 | + void (*write64)(u64, void __iomem *); |
|---|
| 59 | + void (*write64be)(u64, void __iomem *); |
|---|
| 60 | + void (*read8r)(const void __iomem *, void *, unsigned long); |
|---|
| 61 | + void (*read16r)(const void __iomem *, void *, unsigned long); |
|---|
| 62 | + void (*read32r)(const void __iomem *, void *, unsigned long); |
|---|
| 59 | 63 | void (*write8r)(void __iomem *, const void *, unsigned long); |
|---|
| 60 | 64 | void (*write16r)(void __iomem *, const void *, unsigned long); |
|---|
| 61 | 65 | void (*write32r)(void __iomem *, const void *, unsigned long); |
|---|
| .. | .. |
|---|
| 65 | 69 | |
|---|
| 66 | 70 | #define ADDR2PORT(addr) ((unsigned long __force)(addr) & 0xffffff) |
|---|
| 67 | 71 | |
|---|
| 68 | | -static unsigned int ioport_read8(void __iomem *addr) |
|---|
| 72 | +static unsigned int ioport_read8(const void __iomem *addr) |
|---|
| 69 | 73 | { |
|---|
| 70 | 74 | return inb(ADDR2PORT(addr)); |
|---|
| 71 | 75 | } |
|---|
| 72 | 76 | |
|---|
| 73 | | -static unsigned int ioport_read16(void __iomem *addr) |
|---|
| 77 | +static unsigned int ioport_read16(const void __iomem *addr) |
|---|
| 74 | 78 | { |
|---|
| 75 | 79 | return inw(ADDR2PORT(addr)); |
|---|
| 76 | 80 | } |
|---|
| 77 | 81 | |
|---|
| 78 | | -static unsigned int ioport_read32(void __iomem *addr) |
|---|
| 82 | +static unsigned int ioport_read32(const void __iomem *addr) |
|---|
| 79 | 83 | { |
|---|
| 80 | 84 | return inl(ADDR2PORT(addr)); |
|---|
| 81 | 85 | } |
|---|
| .. | .. |
|---|
| 95 | 99 | outl(datum, ADDR2PORT(addr)); |
|---|
| 96 | 100 | } |
|---|
| 97 | 101 | |
|---|
| 98 | | -static void ioport_read8r(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 102 | +static void ioport_read8r(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 99 | 103 | { |
|---|
| 100 | 104 | insb(ADDR2PORT(addr), dst, count); |
|---|
| 101 | 105 | } |
|---|
| 102 | 106 | |
|---|
| 103 | | -static void ioport_read16r(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 107 | +static void ioport_read16r(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 104 | 108 | { |
|---|
| 105 | 109 | insw(ADDR2PORT(addr), dst, count); |
|---|
| 106 | 110 | } |
|---|
| 107 | 111 | |
|---|
| 108 | | -static void ioport_read32r(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 112 | +static void ioport_read32r(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 109 | 113 | { |
|---|
| 110 | 114 | insl(ADDR2PORT(addr), dst, count); |
|---|
| 111 | 115 | } |
|---|
| .. | .. |
|---|
| 146 | 150 | |
|---|
| 147 | 151 | /* Legacy I/O memory ops */ |
|---|
| 148 | 152 | |
|---|
| 149 | | -static unsigned int iomem_read8(void __iomem *addr) |
|---|
| 153 | +static unsigned int iomem_read8(const void __iomem *addr) |
|---|
| 150 | 154 | { |
|---|
| 151 | 155 | return readb(addr); |
|---|
| 152 | 156 | } |
|---|
| 153 | 157 | |
|---|
| 154 | | -static unsigned int iomem_read16(void __iomem *addr) |
|---|
| 158 | +static unsigned int iomem_read16(const void __iomem *addr) |
|---|
| 155 | 159 | { |
|---|
| 156 | 160 | return readw(addr); |
|---|
| 157 | 161 | } |
|---|
| 158 | 162 | |
|---|
| 159 | | -static unsigned int iomem_read16be(void __iomem *addr) |
|---|
| 163 | +static unsigned int iomem_read16be(const void __iomem *addr) |
|---|
| 160 | 164 | { |
|---|
| 161 | 165 | return __raw_readw(addr); |
|---|
| 162 | 166 | } |
|---|
| 163 | 167 | |
|---|
| 164 | | -static unsigned int iomem_read32(void __iomem *addr) |
|---|
| 168 | +static unsigned int iomem_read32(const void __iomem *addr) |
|---|
| 165 | 169 | { |
|---|
| 166 | 170 | return readl(addr); |
|---|
| 167 | 171 | } |
|---|
| 168 | 172 | |
|---|
| 169 | | -static unsigned int iomem_read32be(void __iomem *addr) |
|---|
| 173 | +static unsigned int iomem_read32be(const void __iomem *addr) |
|---|
| 170 | 174 | { |
|---|
| 171 | 175 | return __raw_readl(addr); |
|---|
| 176 | +} |
|---|
| 177 | + |
|---|
| 178 | +static u64 iomem_read64(const void __iomem *addr) |
|---|
| 179 | +{ |
|---|
| 180 | + return readq(addr); |
|---|
| 181 | +} |
|---|
| 182 | + |
|---|
| 183 | +static u64 iomem_read64be(const void __iomem *addr) |
|---|
| 184 | +{ |
|---|
| 185 | + return __raw_readq(addr); |
|---|
| 172 | 186 | } |
|---|
| 173 | 187 | |
|---|
| 174 | 188 | static void iomem_write8(u8 datum, void __iomem *addr) |
|---|
| .. | .. |
|---|
| 196 | 210 | __raw_writel(datum, addr); |
|---|
| 197 | 211 | } |
|---|
| 198 | 212 | |
|---|
| 199 | | -static void iomem_read8r(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 213 | +static void iomem_write64(u64 datum, void __iomem *addr) |
|---|
| 214 | +{ |
|---|
| 215 | + writel(datum, addr); |
|---|
| 216 | +} |
|---|
| 217 | + |
|---|
| 218 | +static void iomem_write64be(u64 datum, void __iomem *addr) |
|---|
| 219 | +{ |
|---|
| 220 | + __raw_writel(datum, addr); |
|---|
| 221 | +} |
|---|
| 222 | + |
|---|
| 223 | +static void iomem_read8r(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 200 | 224 | { |
|---|
| 201 | 225 | while (count--) { |
|---|
| 202 | 226 | *(u8 *)dst = __raw_readb(addr); |
|---|
| .. | .. |
|---|
| 204 | 228 | } |
|---|
| 205 | 229 | } |
|---|
| 206 | 230 | |
|---|
| 207 | | -static void iomem_read16r(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 231 | +static void iomem_read16r(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 208 | 232 | { |
|---|
| 209 | 233 | while (count--) { |
|---|
| 210 | 234 | *(u16 *)dst = __raw_readw(addr); |
|---|
| .. | .. |
|---|
| 212 | 236 | } |
|---|
| 213 | 237 | } |
|---|
| 214 | 238 | |
|---|
| 215 | | -static void iomem_read32r(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 239 | +static void iomem_read32r(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 216 | 240 | { |
|---|
| 217 | 241 | while (count--) { |
|---|
| 218 | 242 | *(u32 *)dst = __raw_readl(addr); |
|---|
| .. | .. |
|---|
| 250 | 274 | .read16be = iomem_read16be, |
|---|
| 251 | 275 | .read32 = iomem_read32, |
|---|
| 252 | 276 | .read32be = iomem_read32be, |
|---|
| 277 | + .read64 = iomem_read64, |
|---|
| 278 | + .read64be = iomem_read64be, |
|---|
| 253 | 279 | .write8 = iomem_write8, |
|---|
| 254 | 280 | .write16 = iomem_write16, |
|---|
| 255 | 281 | .write16be = iomem_write16be, |
|---|
| 256 | 282 | .write32 = iomem_write32, |
|---|
| 257 | 283 | .write32be = iomem_write32be, |
|---|
| 284 | + .write64 = iomem_write64, |
|---|
| 285 | + .write64be = iomem_write64be, |
|---|
| 258 | 286 | .read8r = iomem_read8r, |
|---|
| 259 | 287 | .read16r = iomem_read16r, |
|---|
| 260 | 288 | .read32r = iomem_read32r, |
|---|
| .. | .. |
|---|
| 269 | 297 | }; |
|---|
| 270 | 298 | |
|---|
| 271 | 299 | |
|---|
| 272 | | -unsigned int ioread8(void __iomem *addr) |
|---|
| 300 | +unsigned int ioread8(const void __iomem *addr) |
|---|
| 273 | 301 | { |
|---|
| 274 | 302 | if (unlikely(INDIRECT_ADDR(addr))) |
|---|
| 275 | 303 | return iomap_ops[ADDR_TO_REGION(addr)]->read8(addr); |
|---|
| 276 | 304 | return *((u8 *)addr); |
|---|
| 277 | 305 | } |
|---|
| 278 | 306 | |
|---|
| 279 | | -unsigned int ioread16(void __iomem *addr) |
|---|
| 307 | +unsigned int ioread16(const void __iomem *addr) |
|---|
| 280 | 308 | { |
|---|
| 281 | 309 | if (unlikely(INDIRECT_ADDR(addr))) |
|---|
| 282 | 310 | return iomap_ops[ADDR_TO_REGION(addr)]->read16(addr); |
|---|
| 283 | 311 | return le16_to_cpup((u16 *)addr); |
|---|
| 284 | 312 | } |
|---|
| 285 | 313 | |
|---|
| 286 | | -unsigned int ioread16be(void __iomem *addr) |
|---|
| 314 | +unsigned int ioread16be(const void __iomem *addr) |
|---|
| 287 | 315 | { |
|---|
| 288 | 316 | if (unlikely(INDIRECT_ADDR(addr))) |
|---|
| 289 | 317 | return iomap_ops[ADDR_TO_REGION(addr)]->read16be(addr); |
|---|
| 290 | 318 | return *((u16 *)addr); |
|---|
| 291 | 319 | } |
|---|
| 292 | 320 | |
|---|
| 293 | | -unsigned int ioread32(void __iomem *addr) |
|---|
| 321 | +unsigned int ioread32(const void __iomem *addr) |
|---|
| 294 | 322 | { |
|---|
| 295 | 323 | if (unlikely(INDIRECT_ADDR(addr))) |
|---|
| 296 | 324 | return iomap_ops[ADDR_TO_REGION(addr)]->read32(addr); |
|---|
| 297 | 325 | return le32_to_cpup((u32 *)addr); |
|---|
| 298 | 326 | } |
|---|
| 299 | 327 | |
|---|
| 300 | | -unsigned int ioread32be(void __iomem *addr) |
|---|
| 328 | +unsigned int ioread32be(const void __iomem *addr) |
|---|
| 301 | 329 | { |
|---|
| 302 | 330 | if (unlikely(INDIRECT_ADDR(addr))) |
|---|
| 303 | 331 | return iomap_ops[ADDR_TO_REGION(addr)]->read32be(addr); |
|---|
| 304 | 332 | return *((u32 *)addr); |
|---|
| 333 | +} |
|---|
| 334 | + |
|---|
| 335 | +u64 ioread64(const void __iomem *addr) |
|---|
| 336 | +{ |
|---|
| 337 | + if (unlikely(INDIRECT_ADDR(addr))) |
|---|
| 338 | + return iomap_ops[ADDR_TO_REGION(addr)]->read64(addr); |
|---|
| 339 | + return le64_to_cpup((u64 *)addr); |
|---|
| 340 | +} |
|---|
| 341 | + |
|---|
| 342 | +u64 ioread64be(const void __iomem *addr) |
|---|
| 343 | +{ |
|---|
| 344 | + if (unlikely(INDIRECT_ADDR(addr))) |
|---|
| 345 | + return iomap_ops[ADDR_TO_REGION(addr)]->read64be(addr); |
|---|
| 346 | + return *((u64 *)addr); |
|---|
| 347 | +} |
|---|
| 348 | + |
|---|
| 349 | +u64 ioread64_lo_hi(const void __iomem *addr) |
|---|
| 350 | +{ |
|---|
| 351 | + u32 low, high; |
|---|
| 352 | + |
|---|
| 353 | + low = ioread32(addr); |
|---|
| 354 | + high = ioread32(addr + sizeof(u32)); |
|---|
| 355 | + |
|---|
| 356 | + return low + ((u64)high << 32); |
|---|
| 357 | +} |
|---|
| 358 | + |
|---|
| 359 | +u64 ioread64_hi_lo(const void __iomem *addr) |
|---|
| 360 | +{ |
|---|
| 361 | + u32 low, high; |
|---|
| 362 | + |
|---|
| 363 | + high = ioread32(addr + sizeof(u32)); |
|---|
| 364 | + low = ioread32(addr); |
|---|
| 365 | + |
|---|
| 366 | + return low + ((u64)high << 32); |
|---|
| 305 | 367 | } |
|---|
| 306 | 368 | |
|---|
| 307 | 369 | void iowrite8(u8 datum, void __iomem *addr) |
|---|
| .. | .. |
|---|
| 349 | 411 | } |
|---|
| 350 | 412 | } |
|---|
| 351 | 413 | |
|---|
| 414 | +void iowrite64(u64 datum, void __iomem *addr) |
|---|
| 415 | +{ |
|---|
| 416 | + if (unlikely(INDIRECT_ADDR(addr))) { |
|---|
| 417 | + iomap_ops[ADDR_TO_REGION(addr)]->write64(datum, addr); |
|---|
| 418 | + } else { |
|---|
| 419 | + *((u64 *)addr) = cpu_to_le64(datum); |
|---|
| 420 | + } |
|---|
| 421 | +} |
|---|
| 422 | + |
|---|
| 423 | +void iowrite64be(u64 datum, void __iomem *addr) |
|---|
| 424 | +{ |
|---|
| 425 | + if (unlikely(INDIRECT_ADDR(addr))) { |
|---|
| 426 | + iomap_ops[ADDR_TO_REGION(addr)]->write64be(datum, addr); |
|---|
| 427 | + } else { |
|---|
| 428 | + *((u64 *)addr) = datum; |
|---|
| 429 | + } |
|---|
| 430 | +} |
|---|
| 431 | + |
|---|
| 432 | +void iowrite64_lo_hi(u64 val, void __iomem *addr) |
|---|
| 433 | +{ |
|---|
| 434 | + iowrite32(val, addr); |
|---|
| 435 | + iowrite32(val >> 32, addr + sizeof(u32)); |
|---|
| 436 | +} |
|---|
| 437 | + |
|---|
| 438 | +void iowrite64_hi_lo(u64 val, void __iomem *addr) |
|---|
| 439 | +{ |
|---|
| 440 | + iowrite32(val >> 32, addr + sizeof(u32)); |
|---|
| 441 | + iowrite32(val, addr); |
|---|
| 442 | +} |
|---|
| 443 | + |
|---|
| 352 | 444 | /* Repeating interfaces */ |
|---|
| 353 | 445 | |
|---|
| 354 | | -void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 446 | +void ioread8_rep(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 355 | 447 | { |
|---|
| 356 | 448 | if (unlikely(INDIRECT_ADDR(addr))) { |
|---|
| 357 | 449 | iomap_ops[ADDR_TO_REGION(addr)]->read8r(addr, dst, count); |
|---|
| .. | .. |
|---|
| 363 | 455 | } |
|---|
| 364 | 456 | } |
|---|
| 365 | 457 | |
|---|
| 366 | | -void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 458 | +void ioread16_rep(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 367 | 459 | { |
|---|
| 368 | 460 | if (unlikely(INDIRECT_ADDR(addr))) { |
|---|
| 369 | 461 | iomap_ops[ADDR_TO_REGION(addr)]->read16r(addr, dst, count); |
|---|
| .. | .. |
|---|
| 375 | 467 | } |
|---|
| 376 | 468 | } |
|---|
| 377 | 469 | |
|---|
| 378 | | -void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) |
|---|
| 470 | +void ioread32_rep(const void __iomem *addr, void *dst, unsigned long count) |
|---|
| 379 | 471 | { |
|---|
| 380 | 472 | if (unlikely(INDIRECT_ADDR(addr))) { |
|---|
| 381 | 473 | iomap_ops[ADDR_TO_REGION(addr)]->read32r(addr, dst, count); |
|---|
| .. | .. |
|---|
| 449 | 541 | EXPORT_SYMBOL(ioread16be); |
|---|
| 450 | 542 | EXPORT_SYMBOL(ioread32); |
|---|
| 451 | 543 | EXPORT_SYMBOL(ioread32be); |
|---|
| 544 | +EXPORT_SYMBOL(ioread64); |
|---|
| 545 | +EXPORT_SYMBOL(ioread64be); |
|---|
| 546 | +EXPORT_SYMBOL(ioread64_lo_hi); |
|---|
| 547 | +EXPORT_SYMBOL(ioread64_hi_lo); |
|---|
| 452 | 548 | EXPORT_SYMBOL(iowrite8); |
|---|
| 453 | 549 | EXPORT_SYMBOL(iowrite16); |
|---|
| 454 | 550 | EXPORT_SYMBOL(iowrite16be); |
|---|
| 455 | 551 | EXPORT_SYMBOL(iowrite32); |
|---|
| 456 | 552 | EXPORT_SYMBOL(iowrite32be); |
|---|
| 553 | +EXPORT_SYMBOL(iowrite64); |
|---|
| 554 | +EXPORT_SYMBOL(iowrite64be); |
|---|
| 555 | +EXPORT_SYMBOL(iowrite64_lo_hi); |
|---|
| 556 | +EXPORT_SYMBOL(iowrite64_hi_lo); |
|---|
| 457 | 557 | EXPORT_SYMBOL(ioread8_rep); |
|---|
| 458 | 558 | EXPORT_SYMBOL(ioread16_rep); |
|---|
| 459 | 559 | EXPORT_SYMBOL(ioread32_rep); |
|---|