linux/arch/mips/cavium-octeon/dma-octeon.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 2000  Ani Joshi <ajoshi@unixbox.com>
   7 * Copyright (C) 2000, 2001  Ralf Baechle <ralf@gnu.org>
   8 * Copyright (C) 2005 Ilya A. Volynets-Evenbakh <ilya@total-knowledge.com>
   9 * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
  10 * IP32 changes by Ilya.
  11 * Cavium Networks: Create new dma setup for Cavium Networks Octeon based on
  12 * the kernels original.
  13 */
  14#include <linux/types.h>
  15#include <linux/mm.h>
  16#include <linux/module.h>
  17#include <linux/string.h>
  18#include <linux/dma-mapping.h>
  19#include <linux/platform_device.h>
  20#include <linux/scatterlist.h>
  21
  22#include <linux/cache.h>
  23#include <linux/io.h>
  24
  25#include <asm/octeon/octeon.h>
  26#include <asm/octeon/cvmx-npi-defs.h>
  27#include <asm/octeon/cvmx-pci-defs.h>
  28
  29#include <dma-coherence.h>
  30
  31#ifdef CONFIG_PCI
  32#include <asm/octeon/pci-octeon.h>
  33#endif
  34
  35#define BAR2_PCI_ADDRESS 0x8000000000ul
  36
  37struct bar1_index_state {
  38        int16_t ref_count;      /* Number of PCI mappings using this index */
  39        uint16_t address_bits;  /* Upper bits of physical address. This is
  40                                   shifted 22 bits */
  41};
  42
  43#ifdef CONFIG_PCI
  44static DEFINE_SPINLOCK(bar1_lock);
  45static struct bar1_index_state bar1_state[32];
  46#endif
  47
  48dma_addr_t octeon_map_dma_mem(struct device *dev, void *ptr, size_t size)
  49{
  50#ifndef CONFIG_PCI
  51        /* Without PCI/PCIe this function can be called for Octeon internal
  52           devices such as USB. These devices all support 64bit addressing */
  53        mb();
  54        return virt_to_phys(ptr);
  55#else
  56        unsigned long flags;
  57        uint64_t dma_mask;
  58        int64_t start_index;
  59        dma_addr_t result = -1;
  60        uint64_t physical = virt_to_phys(ptr);
  61        int64_t index;
  62
  63        mb();
  64        /*
  65         * Use the DMA masks to determine the allowed memory
  66         * region. For us it doesn't limit the actual memory, just the
  67         * address visible over PCI.  Devices with limits need to use
  68         * lower indexed Bar1 entries.
  69         */
  70        if (dev) {
  71                dma_mask = dev->coherent_dma_mask;
  72                if (dev->dma_mask)
  73                        dma_mask = *dev->dma_mask;
  74        } else {
  75                dma_mask = 0xfffffffful;
  76        }
  77
  78        /*
  79         * Platform devices, such as the internal USB, skip all
  80         * translation and use Octeon physical addresses directly.
  81         */
  82        if (!dev || dev->bus == &platform_bus_type)
  83                return physical;
  84
  85        switch (octeon_dma_bar_type) {
  86        case OCTEON_DMA_BAR_TYPE_PCIE:
  87                if (unlikely(physical < (16ul << 10)))
  88                        panic("dma_map_single: Not allowed to map first 16KB."
  89                              " It interferes with BAR0 special area\n");
  90                else if ((physical + size >= (256ul << 20)) &&
  91                         (physical < (512ul << 20)))
  92                        panic("dma_map_single: Not allowed to map bootbus\n");
  93                else if ((physical + size >= 0x400000000ull) &&
  94                         physical < 0x410000000ull)
  95                        panic("dma_map_single: "
  96                              "Attempt to map illegal memory address 0x%llx\n",
  97                              physical);
  98                else if (physical >= 0x420000000ull)
  99                        panic("dma_map_single: "
 100                              "Attempt to map illegal memory address 0x%llx\n",
 101                              physical);
 102                else if ((physical + size >=
 103                          (4ull<<30) - (OCTEON_PCI_BAR1_HOLE_SIZE<<20))
 104                         && physical < (4ull<<30))
 105                        pr_warning("dma_map_single: Warning: "
 106                                   "Mapping memory address that might "
 107                                   "conflict with devices 0x%llx-0x%llx\n",
 108                                   physical, physical+size-1);
 109                /* The 2nd 256MB is mapped at 256<<20 instead of 0x410000000 */
 110                if ((physical >= 0x410000000ull) && physical < 0x420000000ull)
 111                        result = physical - 0x400000000ull;
 112                else
 113                        result = physical;
 114                if (((result+size-1) & dma_mask) != result+size-1)
 115                        panic("dma_map_single: Attempt to map address "
 116                              "0x%llx-0x%llx, which can't be accessed "
 117                              "according to the dma mask 0x%llx\n",
 118                              physical, physical+size-1, dma_mask);
 119                goto done;
 120
 121        case OCTEON_DMA_BAR_TYPE_BIG:
 122#ifdef CONFIG_64BIT
 123                /* If the device supports 64bit addressing, then use BAR2 */
 124                if (dma_mask > BAR2_PCI_ADDRESS) {
 125                        result = physical + BAR2_PCI_ADDRESS;
 126                        goto done;
 127                }
 128#endif
 129                if (unlikely(physical < (4ul << 10))) {
 130                        panic("dma_map_single: Not allowed to map first 4KB. "
 131                              "It interferes with BAR0 special area\n");
 132                } else if (physical < (256ul << 20)) {
 133                        if (unlikely(physical + size > (256ul << 20)))
 134                                panic("dma_map_single: Requested memory spans "
 135                                      "Bar0 0:256MB and bootbus\n");
 136                        result = physical;
 137                        goto done;
 138                } else if (unlikely(physical < (512ul << 20))) {
 139                        panic("dma_map_single: Not allowed to map bootbus\n");
 140                } else if (physical < (2ul << 30)) {
 141                        if (unlikely(physical + size > (2ul << 30)))
 142                                panic("dma_map_single: Requested memory spans "
 143                                      "Bar0 512MB:2GB and BAR1\n");
 144                        result = physical;
 145                        goto done;
 146                } else if (physical < (2ul << 30) + (128 << 20)) {
 147                        /* Fall through */
 148                } else if (physical <
 149                           (4ul << 30) - (OCTEON_PCI_BAR1_HOLE_SIZE << 20)) {
 150                        if (unlikely
 151                            (physical + size >
 152                             (4ul << 30) - (OCTEON_PCI_BAR1_HOLE_SIZE << 20)))
 153                                panic("dma_map_single: Requested memory "
 154                                      "extends past Bar1 (4GB-%luMB)\n",
 155                                      OCTEON_PCI_BAR1_HOLE_SIZE);
 156                        result = physical;
 157                        goto done;
 158                } else if ((physical >= 0x410000000ull) &&
 159                           (physical < 0x420000000ull)) {
 160                        if (unlikely(physical + size > 0x420000000ull))
 161                                panic("dma_map_single: Requested memory spans "
 162                                      "non existant memory\n");
 163                        /* BAR0 fixed mapping 256MB:512MB ->
 164                         * 16GB+256MB:16GB+512MB */
 165                        result = physical - 0x400000000ull;
 166                        goto done;
 167                } else {
 168                        /* Continued below switch statement */
 169                }
 170                break;
 171
 172        case OCTEON_DMA_BAR_TYPE_SMALL:
 173#ifdef CONFIG_64BIT
 174                /* If the device supports 64bit addressing, then use BAR2 */
 175                if (dma_mask > BAR2_PCI_ADDRESS) {
 176                        result = physical + BAR2_PCI_ADDRESS;
 177                        goto done;
 178                }
 179#endif
 180                /* Continued below switch statement */
 181                break;
 182
 183        default:
 184                panic("dma_map_single: Invalid octeon_dma_bar_type\n");
 185        }
 186
 187        /* Don't allow mapping to span multiple Bar entries. The hardware guys
 188           won't guarantee that DMA across boards work */
 189        if (unlikely((physical >> 22) != ((physical + size - 1) >> 22)))
 190                panic("dma_map_single: "
 191                      "Requested memory spans more than one Bar1 entry\n");
 192
 193        if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_BIG)
 194                start_index = 31;
 195        else if (unlikely(dma_mask < (1ul << 27)))
 196                start_index = (dma_mask >> 22);
 197        else
 198                start_index = 31;
 199
 200        /* Only one processor can access the Bar register at once */
 201        spin_lock_irqsave(&bar1_lock, flags);
 202
 203        /* Look through Bar1 for existing mapping that will work */
 204        for (index = start_index; index >= 0; index--) {
 205                if ((bar1_state[index].address_bits == physical >> 22) &&
 206                    (bar1_state[index].ref_count)) {
 207                        /* An existing mapping will work, use it */
 208                        bar1_state[index].ref_count++;
 209                        if (unlikely(bar1_state[index].ref_count < 0))
 210                                panic("dma_map_single: "
 211                                      "Bar1[%d] reference count overflowed\n",
 212                                      (int) index);
 213                        result = (index << 22) | (physical & ((1 << 22) - 1));
 214                        /* Large BAR1 is offset at 2GB */
 215                        if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_BIG)
 216                                result += 2ul << 30;
 217                        goto done_unlock;
 218                }
 219        }
 220
 221        /* No existing mappings, look for a free entry */
 222        for (index = start_index; index >= 0; index--) {
 223                if (unlikely(bar1_state[index].ref_count == 0)) {
 224                        union cvmx_pci_bar1_indexx bar1_index;
 225                        /* We have a free entry, use it */
 226                        bar1_state[index].ref_count = 1;
 227                        bar1_state[index].address_bits = physical >> 22;
 228                        bar1_index.u32 = 0;
 229                        /* Address bits[35:22] sent to L2C */
 230                        bar1_index.s.addr_idx = physical >> 22;
 231                        /* Don't put PCI accesses in L2. */
 232                        bar1_index.s.ca = 1;
 233                        /* Endian Swap Mode */
 234                        bar1_index.s.end_swp = 1;
 235                        /* Set '1' when the selected address range is valid. */
 236                        bar1_index.s.addr_v = 1;
 237                        octeon_npi_write32(CVMX_NPI_PCI_BAR1_INDEXX(index),
 238                                           bar1_index.u32);
 239                        /* An existing mapping will work, use it */
 240                        result = (index << 22) | (physical & ((1 << 22) - 1));
 241                        /* Large BAR1 is offset at 2GB */
 242                        if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_BIG)
 243                                result += 2ul << 30;
 244                        goto done_unlock;
 245                }
 246        }
 247
 248        pr_err("dma_map_single: "
 249               "Can't find empty BAR1 index for physical mapping 0x%llx\n",
 250               (unsigned long long) physical);
 251
 252done_unlock:
 253        spin_unlock_irqrestore(&bar1_lock, flags);
 254done:
 255        pr_debug("dma_map_single 0x%llx->0x%llx\n", physical, result);
 256        return result;
 257#endif
 258}
 259
 260void octeon_unmap_dma_mem(struct device *dev, dma_addr_t dma_addr)
 261{
 262#ifndef CONFIG_PCI
 263        /*
 264         * Without PCI/PCIe this function can be called for Octeon internal
 265         * devices such as USB. These devices all support 64bit addressing.
 266         */
 267        return;
 268#else
 269        unsigned long flags;
 270        uint64_t index;
 271
 272        /*
 273         * Platform devices, such as the internal USB, skip all
 274         * translation and use Octeon physical addresses directly.
 275         */
 276        if (dev->bus == &platform_bus_type)
 277                return;
 278
 279        switch (octeon_dma_bar_type) {
 280        case OCTEON_DMA_BAR_TYPE_PCIE:
 281                /* Nothing to do, all mappings are static */
 282                goto done;
 283
 284        case OCTEON_DMA_BAR_TYPE_BIG:
 285#ifdef CONFIG_64BIT
 286                /* Nothing to do for addresses using BAR2 */
 287                if (dma_addr >= BAR2_PCI_ADDRESS)
 288                        goto done;
 289#endif
 290                if (unlikely(dma_addr < (4ul << 10)))
 291                        panic("dma_unmap_single: Unexpect DMA address 0x%llx\n",
 292                              dma_addr);
 293                else if (dma_addr < (2ul << 30))
 294                        /* Nothing to do for addresses using BAR0 */
 295                        goto done;
 296                else if (dma_addr < (2ul << 30) + (128ul << 20))
 297                        /* Need to unmap, fall through */
 298                        index = (dma_addr - (2ul << 30)) >> 22;
 299                else if (dma_addr <
 300                         (4ul << 30) - (OCTEON_PCI_BAR1_HOLE_SIZE << 20))
 301                        goto done;      /* Nothing to do for the rest of BAR1 */
 302                else
 303                        panic("dma_unmap_single: Unexpect DMA address 0x%llx\n",
 304                              dma_addr);
 305                /* Continued below switch statement */
 306                break;
 307
 308        case OCTEON_DMA_BAR_TYPE_SMALL:
 309#ifdef CONFIG_64BIT
 310                /* Nothing to do for addresses using BAR2 */
 311                if (dma_addr >= BAR2_PCI_ADDRESS)
 312                        goto done;
 313#endif
 314                index = dma_addr >> 22;
 315                /* Continued below switch statement */
 316                break;
 317
 318        default:
 319                panic("dma_unmap_single: Invalid octeon_dma_bar_type\n");
 320        }
 321
 322        if (unlikely(index > 31))
 323                panic("dma_unmap_single: "
 324                      "Attempt to unmap an invalid address (0x%llx)\n",
 325                      dma_addr);
 326
 327        spin_lock_irqsave(&bar1_lock, flags);
 328        bar1_state[index].ref_count--;
 329        if (bar1_state[index].ref_count == 0)
 330                octeon_npi_write32(CVMX_NPI_PCI_BAR1_INDEXX(index), 0);
 331        else if (unlikely(bar1_state[index].ref_count < 0))
 332                panic("dma_unmap_single: Bar1[%u] reference count < 0\n",
 333                      (int) index);
 334        spin_unlock_irqrestore(&bar1_lock, flags);
 335done:
 336        pr_debug("dma_unmap_single 0x%llx\n", dma_addr);
 337        return;
 338#endif
 339}
 340