| File: | dev/pci/drm/i915/gt/intel_region_lmem.c |
| Warning: | line 270, column 3 Value stored to 'err' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | // SPDX-License-Identifier: MIT |
| 2 | /* |
| 3 | * Copyright © 2019 Intel Corporation |
| 4 | */ |
| 5 | |
| 6 | #include "i915_drv.h" |
| 7 | #include "i915_pci.h" |
| 8 | #include "i915_reg.h" |
| 9 | #include "intel_memory_region.h" |
| 10 | #include "intel_pci_config.h" |
| 11 | #include "intel_region_lmem.h" |
| 12 | #include "intel_region_ttm.h" |
| 13 | #include "gem/i915_gem_lmem.h" |
| 14 | #include "gem/i915_gem_region.h" |
| 15 | #include "gem/i915_gem_ttm.h" |
| 16 | #include "gt/intel_gt.h" |
| 17 | #include "gt/intel_gt_mcr.h" |
| 18 | #include "gt/intel_gt_regs.h" |
| 19 | |
| 20 | #ifdef CONFIG_64BIT1 |
| 21 | static void _release_bars(struct pci_dev *pdev) |
| 22 | { |
| 23 | STUB()do { printf("%s: stub\n", __func__); } while(0); |
| 24 | #ifdef notyet |
| 25 | int resno; |
| 26 | |
| 27 | for (resno = PCI_STD_RESOURCES; resno < PCI_STD_RESOURCE_END; resno++) { |
| 28 | if (pci_resource_len(pdev, resno)) |
| 29 | pci_release_resource(pdev, resno); |
| 30 | } |
| 31 | #endif |
| 32 | } |
| 33 | |
| 34 | static void |
| 35 | _resize_bar(struct drm_i915_privateinteldrm_softc *i915, int resno, resource_size_t size) |
| 36 | { |
| 37 | STUB()do { printf("%s: stub\n", __func__); } while(0); |
| 38 | #ifdef notyet |
| 39 | struct pci_dev *pdev = i915->drm.pdev; |
| 40 | int bar_size = pci_rebar_bytes_to_size(size); |
| 41 | int ret; |
| 42 | |
| 43 | _release_bars(pdev); |
| 44 | |
| 45 | ret = pci_resize_resource(pdev, resno, bar_size); |
| 46 | if (ret) { |
| 47 | drm_info(&i915->drm, "Failed to resize BAR%d to %dM (%pe)\n",do { } while(0) |
| 48 | resno, 1 << bar_size, ERR_PTR(ret))do { } while(0); |
| 49 | return; |
| 50 | } |
| 51 | |
| 52 | drm_info(&i915->drm, "BAR%d resized to %dM\n", resno, 1 << bar_size)do { } while(0); |
| 53 | #endif |
| 54 | } |
| 55 | |
| 56 | static void i915_resize_lmem_bar(struct drm_i915_privateinteldrm_softc *i915, resource_size_t lmem_size) |
| 57 | { |
| 58 | STUB()do { printf("%s: stub\n", __func__); } while(0); |
| 59 | #ifdef notyet |
| 60 | struct pci_dev *pdev = i915->drm.pdev; |
| 61 | struct pci_bus *root = pdev->bus; |
| 62 | struct resource *root_res; |
| 63 | resource_size_t rebar_size; |
| 64 | resource_size_t current_size; |
| 65 | u32 pci_cmd; |
| 66 | int i; |
| 67 | |
| 68 | current_size = roundup_pow_of_two(pci_resource_len(pdev, GEN12_LMEM_BAR2)); |
| 69 | |
| 70 | if (i915->params.lmem_bar_size) { |
| 71 | u32 bar_sizes; |
| 72 | |
| 73 | rebar_size = i915->params.lmem_bar_size * |
| 74 | (resource_size_t)SZ_1M(1 << 20); |
| 75 | bar_sizes = pci_rebar_get_possible_sizes(pdev, GEN12_LMEM_BAR2); |
| 76 | |
| 77 | if (rebar_size == current_size) |
| 78 | return; |
| 79 | |
| 80 | if (!(bar_sizes & BIT(pci_rebar_bytes_to_size(rebar_size))(1UL << (pci_rebar_bytes_to_size(rebar_size)))) || |
| 81 | rebar_size >= roundup_pow_of_two(lmem_size)) { |
| 82 | rebar_size = lmem_size; |
| 83 | |
| 84 | drm_info(&i915->drm,do { } while(0) |
| 85 | "Given bar size is not within supported size, setting it to default: %llu\n",do { } while(0) |
| 86 | (u64)lmem_size >> 20)do { } while(0); |
| 87 | } |
| 88 | } else { |
| 89 | rebar_size = current_size; |
| 90 | |
| 91 | if (rebar_size != roundup_pow_of_two(lmem_size)) |
| 92 | rebar_size = lmem_size; |
| 93 | else |
| 94 | return; |
| 95 | } |
| 96 | |
| 97 | /* Find out if root bus contains 64bit memory addressing */ |
| 98 | while (root->parent) |
| 99 | root = root->parent; |
| 100 | |
| 101 | pci_bus_for_each_resource(root, root_res, i) { |
| 102 | if (root_res && root_res->flags & (IORESOURCE_MEM0x0001 | IORESOURCE_MEM_64) && |
| 103 | root_res->start > 0x100000000ull) |
| 104 | break; |
| 105 | } |
| 106 | |
| 107 | /* pci_resize_resource will fail anyways */ |
| 108 | if (!root_res) { |
| 109 | drm_info(&i915->drm, "Can't resize LMEM BAR - platform support is missing\n")do { } while(0); |
| 110 | return; |
| 111 | } |
| 112 | |
| 113 | /* First disable PCI memory decoding references */ |
| 114 | pci_read_config_dword(pdev, PCI_COMMAND0x04, &pci_cmd); |
| 115 | pci_write_config_dword(pdev, PCI_COMMAND0x04, |
| 116 | pci_cmd & ~PCI_COMMAND_MEMORY0x00000002); |
| 117 | |
| 118 | _resize_bar(i915, GEN12_LMEM_BAR2, rebar_size); |
| 119 | |
| 120 | pci_assign_unassigned_bus_resources(pdev->bus); |
| 121 | pci_write_config_dword(pdev, PCI_COMMAND0x04, pci_cmd); |
| 122 | #endif |
| 123 | } |
| 124 | #else |
| 125 | static void i915_resize_lmem_bar(struct drm_i915_privateinteldrm_softc *i915, resource_size_t lmem_size) {} |
| 126 | #endif |
| 127 | |
| 128 | static int |
| 129 | region_lmem_release(struct intel_memory_region *mem) |
| 130 | { |
| 131 | int ret; |
| 132 | |
| 133 | ret = intel_region_ttm_fini(mem); |
| 134 | STUB()do { printf("%s: stub\n", __func__); } while(0); |
| 135 | #ifdef notyet |
| 136 | io_mapping_fini(&mem->iomap); |
| 137 | #endif |
| 138 | |
| 139 | return ret; |
| 140 | } |
| 141 | |
| 142 | static int |
| 143 | region_lmem_init(struct intel_memory_region *mem) |
| 144 | { |
| 145 | STUB()do { printf("%s: stub\n", __func__); } while(0); |
| 146 | return -ENOSYS78; |
| 147 | #ifdef notyet |
| 148 | int ret; |
| 149 | |
| 150 | if (!io_mapping_init_wc(&mem->iomap, |
| 151 | mem->io_start, |
| 152 | mem->io_size)) |
| 153 | return -EIO5; |
| 154 | |
| 155 | ret = intel_region_ttm_init(mem); |
| 156 | if (ret) |
| 157 | goto out_no_buddy; |
| 158 | |
| 159 | return 0; |
| 160 | |
| 161 | out_no_buddy: |
| 162 | io_mapping_fini(&mem->iomap); |
| 163 | |
| 164 | return ret; |
| 165 | #endif |
| 166 | } |
| 167 | |
| 168 | static const struct intel_memory_region_ops intel_region_lmem_ops = { |
| 169 | .init = region_lmem_init, |
| 170 | .release = region_lmem_release, |
| 171 | .init_object = __i915_gem_ttm_object_init, |
| 172 | }; |
| 173 | |
| 174 | static bool_Bool get_legacy_lowmem_region(struct intel_uncore *uncore, |
| 175 | u64 *start, u32 *size) |
| 176 | { |
| 177 | if (!IS_DG1_GRAPHICS_STEP(uncore->i915, STEP_A0, STEP_C0)(IS_PLATFORM(uncore->i915, INTEL_DG1) && (({ int __ret = !!((((&(uncore->i915)->__runtime)->step.graphics_step ) == STEP_NONE)); if (__ret) printf("%s %s: " "%s", dev_driver_string (((&(uncore->i915)->drm))->dev), "", "drm_WARN_ON(" "((&(uncore->i915)->__runtime)->step.graphics_step) == STEP_NONE" ")"); __builtin_expect(!!(__ret), 0); }), ((&(uncore-> i915)->__runtime)->step.graphics_step) >= (STEP_A0) && ((&(uncore->i915)->__runtime)->step.graphics_step ) < (STEP_C0)))) |
| 178 | return false0; |
| 179 | |
| 180 | *start = 0; |
| 181 | *size = SZ_1M(1 << 20); |
| 182 | |
| 183 | drm_dbg(&uncore->i915->drm, "LMEM: reserved legacy low-memory [0x%llx-0x%llx]\n",__drm_dev_dbg(((void *)0), (&uncore->i915->drm) ? ( &uncore->i915->drm)->dev : ((void *)0), DRM_UT_DRIVER , "LMEM: reserved legacy low-memory [0x%llx-0x%llx]\n", *start , *start + *size) |
| 184 | *start, *start + *size)__drm_dev_dbg(((void *)0), (&uncore->i915->drm) ? ( &uncore->i915->drm)->dev : ((void *)0), DRM_UT_DRIVER , "LMEM: reserved legacy low-memory [0x%llx-0x%llx]\n", *start , *start + *size); |
| 185 | |
| 186 | return true1; |
| 187 | } |
| 188 | |
| 189 | static int reserve_lowmem_region(struct intel_uncore *uncore, |
| 190 | struct intel_memory_region *mem) |
| 191 | { |
| 192 | u64 reserve_start; |
| 193 | u32 reserve_size; |
| 194 | int ret; |
| 195 | |
| 196 | if (!get_legacy_lowmem_region(uncore, &reserve_start, &reserve_size)) |
| 197 | return 0; |
| 198 | |
| 199 | ret = intel_memory_region_reserve(mem, reserve_start, reserve_size); |
| 200 | if (ret) |
| 201 | drm_err(&uncore->i915->drm, "LMEM: reserving low memory region failed\n")printf("drm:pid%d:%s *ERROR* " "[drm] " "*ERROR* " "LMEM: reserving low memory region failed\n" , ({struct cpu_info *__ci; asm volatile("movq %%gs:%P1,%0" : "=r" (__ci) :"n" (__builtin_offsetof(struct cpu_info, ci_self))); __ci;})->ci_curproc->p_p->ps_pid, __func__); |
| 202 | |
| 203 | return ret; |
| 204 | } |
| 205 | |
| 206 | static struct intel_memory_region *setup_lmem(struct intel_gt *gt) |
| 207 | { |
| 208 | struct drm_i915_privateinteldrm_softc *i915 = gt->i915; |
| 209 | struct intel_uncore *uncore = gt->uncore; |
| 210 | struct pci_dev *pdev = i915->drm.pdev; |
| 211 | struct intel_memory_region *mem; |
| 212 | resource_size_t min_page_size; |
| 213 | resource_size_t io_start; |
| 214 | resource_size_t io_size; |
| 215 | resource_size_t lmem_size; |
| 216 | int err; |
| 217 | |
| 218 | if (!IS_DGFX(i915)((&(i915)->__info)->is_dgfx)) |
| 219 | return ERR_PTR(-ENODEV19); |
| 220 | |
| 221 | #ifdef notyet |
| 222 | if (!i915_pci_resource_valid(pdev, GEN12_LMEM_BAR2)) |
| 223 | return ERR_PTR(-ENXIO6); |
| 224 | #endif |
| 225 | |
| 226 | if (HAS_FLAT_CCS(i915)((&(i915)->__info)->has_flat_ccs)) { |
| 227 | resource_size_t lmem_range; |
| 228 | u64 tile_stolen, flat_ccs_base; |
| 229 | |
| 230 | lmem_range = intel_gt_mcr_read_any(&i915->gt0, XEHP_TILE0_ADDR_RANGE((const i915_reg_t){ .reg = (0x4900) })) & 0xFFFF; |
| 231 | lmem_size = lmem_range >> XEHP_TILE_LMEM_RANGE_SHIFT8; |
| 232 | lmem_size *= SZ_1G(1 << 30); |
| 233 | |
| 234 | flat_ccs_base = intel_gt_mcr_read_any(gt, XEHP_FLAT_CCS_BASE_ADDR((const i915_reg_t){ .reg = (0x4910) })); |
| 235 | flat_ccs_base = (flat_ccs_base >> XEHP_CCS_BASE_SHIFT8) * SZ_64K(64 << 10); |
| 236 | |
| 237 | if (GEM_WARN_ON(lmem_size < flat_ccs_base)({ __builtin_expect(!!(!!(lmem_size < flat_ccs_base)), 0); })) |
| 238 | return ERR_PTR(-EIO5); |
| 239 | |
| 240 | tile_stolen = lmem_size - flat_ccs_base; |
| 241 | |
| 242 | /* If the FLAT_CCS_BASE_ADDR register is not populated, flag an error */ |
| 243 | if (tile_stolen == lmem_size) |
| 244 | drm_err(&i915->drm,printf("drm:pid%d:%s *ERROR* " "[drm] " "*ERROR* " "CCS_BASE_ADDR register did not have expected value\n" , ({struct cpu_info *__ci; asm volatile("movq %%gs:%P1,%0" : "=r" (__ci) :"n" (__builtin_offsetof(struct cpu_info, ci_self))); __ci;})->ci_curproc->p_p->ps_pid, __func__) |
| 245 | "CCS_BASE_ADDR register did not have expected value\n")printf("drm:pid%d:%s *ERROR* " "[drm] " "*ERROR* " "CCS_BASE_ADDR register did not have expected value\n" , ({struct cpu_info *__ci; asm volatile("movq %%gs:%P1,%0" : "=r" (__ci) :"n" (__builtin_offsetof(struct cpu_info, ci_self))); __ci;})->ci_curproc->p_p->ps_pid, __func__); |
| 246 | |
| 247 | lmem_size -= tile_stolen; |
| 248 | } else { |
| 249 | /* Stolen starts from GSMBASE without CCS */ |
| 250 | lmem_size = intel_uncore_read64(&i915->uncore, GEN12_GSMBASE((const i915_reg_t){ .reg = (0x108100) })); |
| 251 | } |
| 252 | |
| 253 | i915_resize_lmem_bar(i915, lmem_size); |
| 254 | |
| 255 | if (i915->params.lmem_size > 0) { |
| 256 | lmem_size = min_t(resource_size_t, lmem_size,({ resource_size_t __min_a = (lmem_size); resource_size_t __min_b = (mul_u32_u32(i915->params.lmem_size, (1 << 20))); __min_a < __min_b ? __min_a : __min_b; }) |
| 257 | mul_u32_u32(i915->params.lmem_size, SZ_1M))({ resource_size_t __min_a = (lmem_size); resource_size_t __min_b = (mul_u32_u32(i915->params.lmem_size, (1 << 20))); __min_a < __min_b ? __min_a : __min_b; }); |
| 258 | } |
| 259 | |
| 260 | #ifdef __linux__ |
| 261 | io_start = pci_resource_start(pdev, GEN12_LMEM_BAR2); |
| 262 | io_size = min(pci_resource_len(pdev, GEN12_LMEM_BAR), lmem_size)(((pci_resource_len(pdev, 2))<(lmem_size))?(pci_resource_len (pdev, 2)):(lmem_size)); |
| 263 | #else |
| 264 | { |
| 265 | pcireg_t type; |
| 266 | bus_size_t len; |
| 267 | |
| 268 | type = pci_mapreg_type(i915->pc, i915->tag, |
| 269 | 0x10 + (4 * GEN12_LMEM_BAR2)); |
| 270 | err = -pci_mapreg_info(i915->pc, i915->tag, |
Value stored to 'err' is never read | |
| 271 | 0x10 + (4 * GEN12_LMEM_BAR2), type, &io_start, &len, NULL((void *)0)); |
| 272 | io_size = min(len, lmem_size)(((len)<(lmem_size))?(len):(lmem_size)); |
| 273 | } |
| 274 | #endif |
| 275 | if (!io_size) |
| 276 | return ERR_PTR(-EIO5); |
| 277 | |
| 278 | min_page_size = HAS_64K_PAGES(i915)((&(i915)->__info)->has_64k_pages) ? I915_GTT_PAGE_SIZE_64K(1ULL << (16)) : |
| 279 | I915_GTT_PAGE_SIZE_4K(1ULL << (12)); |
| 280 | mem = intel_memory_region_create(i915, |
| 281 | 0, |
| 282 | lmem_size, |
| 283 | min_page_size, |
| 284 | io_start, |
| 285 | io_size, |
| 286 | INTEL_MEMORY_LOCAL, |
| 287 | 0, |
| 288 | &intel_region_lmem_ops); |
| 289 | if (IS_ERR(mem)) |
| 290 | return mem; |
| 291 | |
| 292 | err = reserve_lowmem_region(uncore, mem); |
| 293 | if (err) |
| 294 | goto err_region_put; |
| 295 | |
| 296 | drm_dbg(&i915->drm, "Local memory: %pR\n", &mem->region)__drm_dev_dbg(((void *)0), (&i915->drm) ? (&i915-> drm)->dev : ((void *)0), DRM_UT_DRIVER, "Local memory: %pR\n" , &mem->region); |
| 297 | drm_dbg(&i915->drm, "Local memory IO start: %pa\n",__drm_dev_dbg(((void *)0), (&i915->drm) ? (&i915-> drm)->dev : ((void *)0), DRM_UT_DRIVER, "Local memory IO start: %pa\n" , &mem->io_start) |
| 298 | &mem->io_start)__drm_dev_dbg(((void *)0), (&i915->drm) ? (&i915-> drm)->dev : ((void *)0), DRM_UT_DRIVER, "Local memory IO start: %pa\n" , &mem->io_start); |
| 299 | drm_info(&i915->drm, "Local memory IO size: %pa\n",do { } while(0) |
| 300 | &mem->io_size)do { } while(0); |
| 301 | drm_info(&i915->drm, "Local memory available: %pa\n",do { } while(0) |
| 302 | &lmem_size)do { } while(0); |
| 303 | |
| 304 | if (io_size < lmem_size) |
| 305 | drm_info(&i915->drm, "Using a reduced BAR size of %lluMiB. Consider enabling 'Resizable BAR' or similar, if available in the BIOS.\n",do { } while(0) |
| 306 | (u64)io_size >> 20)do { } while(0); |
| 307 | |
| 308 | return mem; |
| 309 | |
| 310 | err_region_put: |
| 311 | intel_memory_region_destroy(mem); |
| 312 | return ERR_PTR(err); |
| 313 | } |
| 314 | |
| 315 | struct intel_memory_region *intel_gt_setup_lmem(struct intel_gt *gt) |
| 316 | { |
| 317 | return setup_lmem(gt); |
| 318 | } |