LCOV - code coverage report
Current view: top level - drivers/gpu/drm/i915 - intel_region_lmem.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 60 0.0 %
Date: 2022-03-28 13:20:08 Functions: 0 5 0.0 %
Branches: 0 18 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: MIT
       2                 :            : /*
       3                 :            :  * Copyright © 2019 Intel Corporation
       4                 :            :  */
       5                 :            : 
       6                 :            : #include "i915_drv.h"
       7                 :            : #include "intel_memory_region.h"
       8                 :            : #include "gem/i915_gem_lmem.h"
       9                 :            : #include "gem/i915_gem_region.h"
      10                 :            : #include "intel_region_lmem.h"
      11                 :            : 
      12                 :          0 : static int init_fake_lmem_bar(struct intel_memory_region *mem)
      13                 :            : {
      14                 :          0 :         struct drm_i915_private *i915 = mem->i915;
      15                 :          0 :         struct i915_ggtt *ggtt = &i915->ggtt;
      16                 :          0 :         unsigned long n;
      17                 :          0 :         int ret;
      18                 :            : 
      19                 :            :         /* We want to 1:1 map the mappable aperture to our reserved region */
      20                 :            : 
      21                 :          0 :         mem->fake_mappable.start = 0;
      22                 :          0 :         mem->fake_mappable.size = resource_size(&mem->region);
      23                 :          0 :         mem->fake_mappable.color = I915_COLOR_UNEVICTABLE;
      24                 :            : 
      25                 :          0 :         ret = drm_mm_reserve_node(&ggtt->vm.mm, &mem->fake_mappable);
      26         [ #  # ]:          0 :         if (ret)
      27                 :            :                 return ret;
      28                 :            : 
      29                 :          0 :         mem->remap_addr = dma_map_resource(&i915->drm.pdev->dev,
      30                 :            :                                            mem->region.start,
      31                 :          0 :                                            mem->fake_mappable.size,
      32                 :            :                                            PCI_DMA_BIDIRECTIONAL,
      33                 :            :                                            DMA_ATTR_FORCE_CONTIGUOUS);
      34                 :          0 :         if (dma_mapping_error(&i915->drm.pdev->dev, mem->remap_addr)) {
      35                 :          0 :                 drm_mm_remove_node(&mem->fake_mappable);
      36                 :          0 :                 return -EINVAL;
      37                 :            :         }
      38                 :            : 
      39         [ #  # ]:          0 :         for (n = 0; n < mem->fake_mappable.size >> PAGE_SHIFT; ++n) {
      40                 :          0 :                 ggtt->vm.insert_page(&ggtt->vm,
      41                 :          0 :                                      mem->remap_addr + (n << PAGE_SHIFT),
      42                 :          0 :                                      n << PAGE_SHIFT,
      43                 :            :                                      I915_CACHE_NONE, 0);
      44                 :            :         }
      45                 :            : 
      46                 :          0 :         mem->region = (struct resource)DEFINE_RES_MEM(mem->remap_addr,
      47                 :            :                                                       mem->fake_mappable.size);
      48                 :            : 
      49                 :          0 :         return 0;
      50                 :            : }
      51                 :            : 
      52                 :          0 : static void release_fake_lmem_bar(struct intel_memory_region *mem)
      53                 :            : {
      54         [ #  # ]:          0 :         if (!drm_mm_node_allocated(&mem->fake_mappable))
      55                 :            :                 return;
      56                 :            : 
      57                 :          0 :         drm_mm_remove_node(&mem->fake_mappable);
      58                 :            : 
      59                 :          0 :         dma_unmap_resource(&mem->i915->drm.pdev->dev,
      60                 :            :                            mem->remap_addr,
      61                 :          0 :                            mem->fake_mappable.size,
      62                 :            :                            PCI_DMA_BIDIRECTIONAL,
      63                 :            :                            DMA_ATTR_FORCE_CONTIGUOUS);
      64                 :            : }
      65                 :            : 
      66                 :            : static void
      67                 :          0 : region_lmem_release(struct intel_memory_region *mem)
      68                 :            : {
      69                 :          0 :         release_fake_lmem_bar(mem);
      70                 :          0 :         io_mapping_fini(&mem->iomap);
      71                 :          0 :         intel_memory_region_release_buddy(mem);
      72                 :          0 : }
      73                 :            : 
      74                 :            : static int
      75                 :          0 : region_lmem_init(struct intel_memory_region *mem)
      76                 :            : {
      77                 :          0 :         int ret;
      78                 :            : 
      79         [ #  # ]:          0 :         if (i915_modparams.fake_lmem_start) {
      80                 :          0 :                 ret = init_fake_lmem_bar(mem);
      81                 :          0 :                 GEM_BUG_ON(ret);
      82                 :            :         }
      83                 :            : 
      84         [ #  # ]:          0 :         if (!io_mapping_init_wc(&mem->iomap,
      85                 :            :                                 mem->io_start,
      86                 :          0 :                                 resource_size(&mem->region)))
      87                 :            :                 return -EIO;
      88                 :            : 
      89                 :          0 :         ret = intel_memory_region_init_buddy(mem);
      90         [ #  # ]:          0 :         if (ret)
      91                 :          0 :                 io_mapping_fini(&mem->iomap);
      92                 :            : 
      93                 :          0 :         intel_memory_region_set_name(mem, "local");
      94                 :            : 
      95                 :          0 :         return ret;
      96                 :            : }
      97                 :            : 
      98                 :            : const struct intel_memory_region_ops intel_region_lmem_ops = {
      99                 :            :         .init = region_lmem_init,
     100                 :            :         .release = region_lmem_release,
     101                 :            :         .create_object = __i915_gem_lmem_object_create,
     102                 :            : };
     103                 :            : 
     104                 :            : struct intel_memory_region *
     105                 :          0 : intel_setup_fake_lmem(struct drm_i915_private *i915)
     106                 :            : {
     107                 :          0 :         struct pci_dev *pdev = i915->drm.pdev;
     108                 :          0 :         struct intel_memory_region *mem;
     109                 :          0 :         resource_size_t mappable_end;
     110                 :          0 :         resource_size_t io_start;
     111                 :          0 :         resource_size_t start;
     112                 :            : 
     113                 :          0 :         GEM_BUG_ON(i915_ggtt_has_aperture(&i915->ggtt));
     114                 :          0 :         GEM_BUG_ON(!i915_modparams.fake_lmem_start);
     115                 :            : 
     116                 :            :         /* Your mappable aperture belongs to me now! */
     117   [ #  #  #  # ]:          0 :         mappable_end = pci_resource_len(pdev, 2);
     118                 :          0 :         io_start = pci_resource_start(pdev, 2),
     119                 :          0 :         start = i915_modparams.fake_lmem_start;
     120                 :            : 
     121                 :          0 :         mem = intel_memory_region_create(i915,
     122                 :            :                                          start,
     123                 :            :                                          mappable_end,
     124                 :            :                                          PAGE_SIZE,
     125                 :            :                                          io_start,
     126                 :            :                                          &intel_region_lmem_ops);
     127         [ #  # ]:          0 :         if (!IS_ERR(mem)) {
     128                 :          0 :                 drm_info(&i915->drm, "Intel graphics fake LMEM: %pR\n",
     129                 :            :                          &mem->region);
     130                 :          0 :                 drm_info(&i915->drm,
     131                 :            :                          "Intel graphics fake LMEM IO start: %llx\n",
     132                 :            :                         (u64)mem->io_start);
     133                 :          0 :                 drm_info(&i915->drm, "Intel graphics fake LMEM size: %llx\n",
     134                 :            :                          (u64)resource_size(&mem->region));
     135                 :            :         }
     136                 :            : 
     137                 :          0 :         return mem;
     138                 :            : }

Generated by: LCOV version 1.14