Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-misc-next-2022-11-03' of git://anongit.freedesktop.org/drm/drm-misc into drm-next

drm-misc-next for 6.2:

UAPI Changes:

Cross-subsystem Changes:
- dma-buf: locking improvements
- firmware: New API in the RaspberryPi firmware driver used by vc4

Core Changes:
- client: Null pointer dereference fix in drm_client_buffer_delete()
- mm/buddy: Add back random seed log
- ttm: Convert ttm_resource to use size_t for its size, fix for an
undefined behaviour

Driver Changes:
- bridge:
- adv7511: use dev_err_probe
- it6505: Fix return value check of pm_runtime_get_sync
- panel:
- sitronix: Fixes and clean-ups
- lcdif: Increase DMA burst size
- rockchip: runtime_pm improvements
- vc4: Fix for a regression preventing the use of 4k @ 60Hz, and
further HDMI rate constraints check.
- vmwgfx: Cursor improvements

Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20221103083437.ksrh3hcdvxaof62l@houat

+346 -274
-19
drivers/clk/bcm/clk-raspberrypi.c
··· 18 18 19 19 #include <soc/bcm2835/raspberrypi-firmware.h> 20 20 21 - enum rpi_firmware_clk_id { 22 - RPI_FIRMWARE_EMMC_CLK_ID = 1, 23 - RPI_FIRMWARE_UART_CLK_ID, 24 - RPI_FIRMWARE_ARM_CLK_ID, 25 - RPI_FIRMWARE_CORE_CLK_ID, 26 - RPI_FIRMWARE_V3D_CLK_ID, 27 - RPI_FIRMWARE_H264_CLK_ID, 28 - RPI_FIRMWARE_ISP_CLK_ID, 29 - RPI_FIRMWARE_SDRAM_CLK_ID, 30 - RPI_FIRMWARE_PIXEL_CLK_ID, 31 - RPI_FIRMWARE_PWM_CLK_ID, 32 - RPI_FIRMWARE_HEVC_CLK_ID, 33 - RPI_FIRMWARE_EMMC2_CLK_ID, 34 - RPI_FIRMWARE_M2MC_CLK_ID, 35 - RPI_FIRMWARE_PIXEL_BVB_CLK_ID, 36 - RPI_FIRMWARE_VEC_CLK_ID, 37 - RPI_FIRMWARE_NUM_CLK_ID, 38 - }; 39 - 40 21 static char *rpi_firmware_clk_names[] = { 41 22 [RPI_FIRMWARE_EMMC_CLK_ID] = "emmc", 42 23 [RPI_FIRMWARE_UART_CLK_ID] = "uart",
+2 -2
drivers/dma-buf/dma-buf.c
··· 995 995 */ 996 996 void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) 997 997 { 998 - if (WARN_ON(!dmabuf || !attach)) 998 + if (WARN_ON(!dmabuf || !attach || dmabuf != attach->dmabuf)) 999 999 return; 1000 1000 1001 - dma_resv_lock(attach->dmabuf->resv, NULL); 1001 + dma_resv_lock(dmabuf->resv, NULL); 1002 1002 1003 1003 if (attach->sgt) { 1004 1004
+32 -6
drivers/firmware/raspberrypi.c
··· 228 228 -1, NULL, 0); 229 229 } 230 230 231 + unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw, unsigned int id) 232 + { 233 + struct rpi_firmware_clk_rate_request msg = 234 + RPI_FIRMWARE_CLK_RATE_REQUEST(id); 235 + int ret; 236 + 237 + ret = rpi_firmware_property(fw, RPI_FIRMWARE_GET_MAX_CLOCK_RATE, 238 + &msg, sizeof(msg)); 239 + if (ret) 240 + /* 241 + * If our firmware doesn't support that operation, or fails, we 242 + * assume the maximum clock rate is absolute maximum we can 243 + * store over our type. 244 + */ 245 + return UINT_MAX; 246 + 247 + return le32_to_cpu(msg.rate); 248 + } 249 + EXPORT_SYMBOL_GPL(rpi_firmware_clk_get_max_rate); 250 + 231 251 static void rpi_firmware_delete(struct kref *kref) 232 252 { 233 253 struct rpi_firmware *fw = container_of(kref, struct rpi_firmware, ··· 331 311 return 0; 332 312 } 333 313 314 + static const struct of_device_id rpi_firmware_of_match[] = { 315 + { .compatible = "raspberrypi,bcm2835-firmware", }, 316 + {}, 317 + }; 318 + MODULE_DEVICE_TABLE(of, rpi_firmware_of_match); 319 + 320 + struct device_node *rpi_firmware_find_node(void) 321 + { 322 + return of_find_matching_node(NULL, rpi_firmware_of_match); 323 + } 324 + EXPORT_SYMBOL_GPL(rpi_firmware_find_node); 325 + 334 326 /** 335 327 * rpi_firmware_get - Get pointer to rpi_firmware structure. 336 328 * @firmware_node: Pointer to the firmware Device Tree node. ··· 397 365 return fw; 398 366 } 399 367 EXPORT_SYMBOL_GPL(devm_rpi_firmware_get); 400 - 401 - static const struct of_device_id rpi_firmware_of_match[] = { 402 - { .compatible = "raspberrypi,bcm2835-firmware", }, 403 - {}, 404 - }; 405 - MODULE_DEVICE_TABLE(of, rpi_firmware_of_match); 406 368 407 369 static struct platform_driver rpi_firmware_driver = { 408 370 .driver = {
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
··· 144 144 node->base.start = node->mm_nodes[0].start; 145 145 } else { 146 146 node->mm_nodes[0].start = 0; 147 - node->mm_nodes[0].size = node->base.num_pages; 147 + node->mm_nodes[0].size = PFN_UP(node->base.size); 148 148 node->base.start = AMDGPU_BO_INVALID_OFFSET; 149 149 } 150 150
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 542 542 /* GWS and OA don't need any alignment. */ 543 543 page_align = bp->byte_align; 544 544 size <<= PAGE_SHIFT; 545 + 545 546 } else if (bp->domain & AMDGPU_GEM_DOMAIN_GDS) { 546 547 /* Both size and alignment must be a multiple of 4. */ 547 548 page_align = ALIGN(bp->byte_align, 4); ··· 777 776 return 0; 778 777 } 779 778 780 - r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.resource->num_pages, &bo->kmap); 779 + r = ttm_bo_kmap(&bo->tbo, 0, PFN_UP(bo->tbo.base.size), &bo->kmap); 781 780 if (r) 782 781 return r; 783 782
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h
··· 62 62 if (!res) 63 63 goto fallback; 64 64 65 - BUG_ON(start + size > res->num_pages << PAGE_SHIFT); 65 + BUG_ON(start + size > res->size); 66 66 67 67 cur->mem_type = res->mem_type; 68 68 ··· 110 110 cur->size = size; 111 111 cur->remaining = size; 112 112 cur->node = NULL; 113 - WARN_ON(res && start + size > res->num_pages << PAGE_SHIFT); 113 + WARN_ON(res && start + size > res->size); 114 114 return; 115 115 } 116 116
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
··· 127 127 128 128 TP_fast_assign( 129 129 __entry->bo = bo; 130 - __entry->pages = bo->tbo.resource->num_pages; 130 + __entry->pages = PFN_UP(bo->tbo.resource->size); 131 131 __entry->type = bo->tbo.resource->mem_type; 132 132 __entry->prefer = bo->preferred_domains; 133 133 __entry->allow = bo->allowed_domains;
+3 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 381 381 dst.offset = 0; 382 382 383 383 r = amdgpu_ttm_copy_mem_to_mem(adev, &src, &dst, 384 - new_mem->num_pages << PAGE_SHIFT, 384 + new_mem->size, 385 385 amdgpu_bo_encrypted(abo), 386 386 bo->base.resv, &fence); 387 387 if (r) ··· 424 424 static bool amdgpu_mem_visible(struct amdgpu_device *adev, 425 425 struct ttm_resource *mem) 426 426 { 427 - u64 mem_size = (u64)mem->num_pages << PAGE_SHIFT; 427 + u64 mem_size = (u64)mem->size; 428 428 struct amdgpu_res_cursor cursor; 429 429 u64 end; 430 430 ··· 571 571 struct ttm_resource *mem) 572 572 { 573 573 struct amdgpu_device *adev = amdgpu_ttm_adev(bdev); 574 - size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT; 574 + size_t bus_size = (size_t)mem->size; 575 575 576 576 switch (mem->mem_type) { 577 577 case TTM_PL_SYSTEM:
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
··· 439 439 /* Allocate blocks in desired range */ 440 440 vres->flags |= DRM_BUDDY_RANGE_ALLOCATION; 441 441 442 - remaining_size = (u64)vres->base.num_pages << PAGE_SHIFT; 442 + remaining_size = (u64)vres->base.size; 443 443 444 444 mutex_lock(&mgr->lock); 445 445 while (remaining_size) { ··· 498 498 LIST_HEAD(temp); 499 499 500 500 trim_list = &vres->blocks; 501 - original_size = (u64)vres->base.num_pages << PAGE_SHIFT; 501 + original_size = (u64)vres->base.size; 502 502 503 503 /* 504 504 * If size value is rounded up to min_block_size, trim the last ··· 533 533 amdgpu_vram_mgr_block_size(block); 534 534 start >>= PAGE_SHIFT; 535 535 536 - if (start > vres->base.num_pages) 537 - start -= vres->base.num_pages; 536 + if (start > PFN_UP(vres->base.size)) 537 + start -= PFN_UP(vres->base.size); 538 538 else 539 539 start = 0; 540 540 vres->base.start = max(vres->base.start, start);
+2 -4
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
··· 1219 1219 return ret; 1220 1220 1221 1221 ret = adv7511_init_regulators(adv7511); 1222 - if (ret) { 1223 - dev_err(dev, "failed to init regulators\n"); 1224 - return ret; 1225 - } 1222 + if (ret) 1223 + return dev_err_probe(dev, ret, "failed to init regulators\n"); 1226 1224 1227 1225 /* 1228 1226 * The power down GPIO is optional. If present, toggle it from active to
+8 -12
drivers/gpu/drm/bridge/adv7511/adv7533.c
··· 149 149 }; 150 150 151 151 host = of_find_mipi_dsi_host_by_node(adv->host_node); 152 - if (!host) { 153 - dev_err(dev, "failed to find dsi host\n"); 154 - return -EPROBE_DEFER; 155 - } 152 + if (!host) 153 + return dev_err_probe(dev, -EPROBE_DEFER, 154 + "failed to find dsi host\n"); 156 155 157 156 dsi = devm_mipi_dsi_device_register_full(dev, host, &info); 158 - if (IS_ERR(dsi)) { 159 - dev_err(dev, "failed to create dsi device\n"); 160 - return PTR_ERR(dsi); 161 - } 157 + if (IS_ERR(dsi)) 158 + return dev_err_probe(dev, PTR_ERR(dsi), 159 + "failed to create dsi device\n"); 162 160 163 161 adv->dsi = dsi; 164 162 ··· 166 168 MIPI_DSI_MODE_NO_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE; 167 169 168 170 ret = devm_mipi_dsi_attach(dev, dsi); 169 - if (ret < 0) { 170 - dev_err(dev, "failed to attach dsi to host\n"); 171 - return ret; 172 - } 171 + if (ret < 0) 172 + return dev_err_probe(dev, ret, "failed to attach dsi to host\n"); 173 173 174 174 return 0; 175 175 }
+1 -1
drivers/gpu/drm/bridge/ite-it6505.c
··· 2699 2699 * pm_runtime_force_resume re-enables runtime power management. 2700 2700 * Handling the error here to make sure the bridge is powered on. 2701 2701 */ 2702 - if (ret) 2702 + if (ret < 0) 2703 2703 it6505_poweron(it6505); 2704 2704 2705 2705 complete_all(&it6505->extcon_completion);
+3 -3
drivers/gpu/drm/drm_client.c
··· 235 235 { 236 236 struct drm_device *dev = buffer->client->dev; 237 237 238 - drm_gem_vunmap_unlocked(buffer->gem, &buffer->map); 239 - 240 - if (buffer->gem) 238 + if (buffer->gem) { 239 + drm_gem_vunmap_unlocked(buffer->gem, &buffer->map); 241 240 drm_gem_object_put(buffer->gem); 241 + } 242 242 243 243 if (buffer->handle) 244 244 drm_mode_destroy_dumb(dev, buffer->handle, buffer->client->file);
+1 -1
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
··· 649 649 if (!i915_ttm_cpu_maps_iomem(res)) 650 650 return true; 651 651 652 - return bman_res->used_visible_size == bman_res->base.num_pages; 652 + return bman_res->used_visible_size == PFN_UP(bman_res->base.size); 653 653 } 654 654 655 655 static int i915_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *mem)
+2 -2
drivers/gpu/drm/i915/i915_scatterlist.c
··· 158 158 u32 page_alignment) 159 159 { 160 160 struct i915_ttm_buddy_resource *bman_res = to_ttm_buddy_resource(res); 161 - const u64 size = res->num_pages << PAGE_SHIFT; 161 + const u64 size = res->size; 162 162 const u32 max_segment = round_down(UINT_MAX, page_alignment); 163 163 struct drm_buddy *mm = bman_res->mm; 164 164 struct list_head *blocks = &bman_res->blocks; ··· 177 177 178 178 i915_refct_sgt_init(rsgt, size); 179 179 st = &rsgt->table; 180 - if (sg_alloc_table(st, res->num_pages, GFP_KERNEL)) { 180 + if (sg_alloc_table(st, PFN_UP(res->size), GFP_KERNEL)) { 181 181 i915_refct_sgt_put(rsgt); 182 182 return ERR_PTR(-ENOMEM); 183 183 }
+6 -6
drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
··· 62 62 if (place->fpfn || lpfn != man->size) 63 63 bman_res->flags |= DRM_BUDDY_RANGE_ALLOCATION; 64 64 65 - GEM_BUG_ON(!bman_res->base.num_pages); 66 - size = bman_res->base.num_pages << PAGE_SHIFT; 65 + GEM_BUG_ON(!bman_res->base.size); 66 + size = bman_res->base.size; 67 67 68 68 min_page_size = bman->default_page_size; 69 69 if (bo->page_alignment) ··· 72 72 GEM_BUG_ON(min_page_size < mm->chunk_size); 73 73 GEM_BUG_ON(!IS_ALIGNED(size, min_page_size)); 74 74 75 - if (place->fpfn + bman_res->base.num_pages != place->lpfn && 75 + if (place->fpfn + PFN_UP(bman_res->base.size) != place->lpfn && 76 76 place->flags & TTM_PL_FLAG_CONTIGUOUS) { 77 77 unsigned long pages; 78 78 ··· 108 108 goto err_free_blocks; 109 109 110 110 if (place->flags & TTM_PL_FLAG_CONTIGUOUS) { 111 - u64 original_size = (u64)bman_res->base.num_pages << PAGE_SHIFT; 111 + u64 original_size = (u64)bman_res->base.size; 112 112 113 113 drm_buddy_block_trim(mm, 114 114 original_size, ··· 116 116 } 117 117 118 118 if (lpfn <= bman->visible_size) { 119 - bman_res->used_visible_size = bman_res->base.num_pages; 119 + bman_res->used_visible_size = PFN_UP(bman_res->base.size); 120 120 } else { 121 121 struct drm_buddy_block *block; 122 122 ··· 228 228 229 229 if (!place->fpfn && 230 230 place->lpfn == i915_ttm_buddy_man_visible_size(man)) 231 - return bman_res->used_visible_size == res->num_pages; 231 + return bman_res->used_visible_size == PFN_UP(res->size); 232 232 233 233 /* Check each drm buddy block individually */ 234 234 list_for_each_entry(block, &bman_res->blocks, link) {
+1 -1
drivers/gpu/drm/i915/intel_region_ttm.c
··· 244 244 struct ttm_resource_manager *man = mem->region_private; 245 245 struct ttm_buffer_object mock_bo = {}; 246 246 247 - mock_bo.base.size = res->num_pages << PAGE_SHIFT; 247 + mock_bo.base.size = res->size; 248 248 mock_bo.bdev = &mem->i915->bdev; 249 249 res->bo = &mock_bo; 250 250
+12 -2
drivers/gpu/drm/mxsfb/lcdif_kms.c
··· 314 314 CTRLDESCL0_1_WIDTH(m->hdisplay), 315 315 lcdif->base + LCDC_V8_CTRLDESCL0_1); 316 316 317 - writel(CTRLDESCL0_3_PITCH(lcdif->crtc.primary->state->fb->pitches[0]), 318 - lcdif->base + LCDC_V8_CTRLDESCL0_3); 317 + /* 318 + * Undocumented P_SIZE and T_SIZE register but those written in the 319 + * downstream kernel those registers control the AXI burst size. As of 320 + * now there are two known values: 321 + * 1 - 128Byte 322 + * 2 - 256Byte 323 + * Downstream set it to 256B burst size to improve the memory 324 + * efficiency so set it here too. 325 + */ 326 + ctrl = CTRLDESCL0_3_P_SIZE(2) | CTRLDESCL0_3_T_SIZE(2) | 327 + CTRLDESCL0_3_PITCH(lcdif->crtc.primary->state->fb->pitches[0]); 328 + writel(ctrl, lcdif->base + LCDC_V8_CTRLDESCL0_3); 319 329 } 320 330 321 331 static void lcdif_enable_controller(struct lcdif_drm_private *lcdif)
+4
drivers/gpu/drm/mxsfb/lcdif_regs.h
··· 190 190 #define CTRLDESCL0_1_WIDTH(n) ((n) & 0xffff) 191 191 #define CTRLDESCL0_1_WIDTH_MASK GENMASK(15, 0) 192 192 193 + #define CTRLDESCL0_3_P_SIZE(n) (((n) << 20) & CTRLDESCL0_3_P_SIZE_MASK) 194 + #define CTRLDESCL0_3_P_SIZE_MASK GENMASK(22, 20) 195 + #define CTRLDESCL0_3_T_SIZE(n) (((n) << 16) & CTRLDESCL0_3_T_SIZE_MASK) 196 + #define CTRLDESCL0_3_T_SIZE_MASK GENMASK(17, 16) 193 197 #define CTRLDESCL0_3_PITCH(n) ((n) & 0xffff) 194 198 #define CTRLDESCL0_3_PITCH_MASK GENMASK(15, 0) 195 199
+2 -2
drivers/gpu/drm/nouveau/nouveau_bo.c
··· 532 532 if (ret) 533 533 return ret; 534 534 535 - ret = ttm_bo_kmap(&nvbo->bo, 0, nvbo->bo.resource->num_pages, &nvbo->kmap); 535 + ret = ttm_bo_kmap(&nvbo->bo, 0, PFN_UP(nvbo->bo.base.size), &nvbo->kmap); 536 536 537 537 ttm_bo_unreserve(&nvbo->bo); 538 538 return ret; ··· 1236 1236 } else { 1237 1237 /* make sure bo is in mappable vram */ 1238 1238 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA || 1239 - bo->resource->start + bo->resource->num_pages < mappable) 1239 + bo->resource->start + PFN_UP(bo->resource->size) < mappable) 1240 1240 return 0; 1241 1241 1242 1242 for (i = 0; i < nvbo->placement.num_placement; ++i) {
+2 -2
drivers/gpu/drm/nouveau/nouveau_bo0039.c
··· 52 52 u32 src_offset = old_reg->start << PAGE_SHIFT; 53 53 u32 dst_ctxdma = nouveau_bo_mem_ctxdma(bo, chan, new_reg); 54 54 u32 dst_offset = new_reg->start << PAGE_SHIFT; 55 - u32 page_count = new_reg->num_pages; 55 + u32 page_count = PFN_UP(new_reg->size); 56 56 int ret; 57 57 58 58 ret = PUSH_WAIT(push, 3); ··· 62 62 PUSH_MTHD(push, NV039, SET_CONTEXT_DMA_BUFFER_IN, src_ctxdma, 63 63 SET_CONTEXT_DMA_BUFFER_OUT, dst_ctxdma); 64 64 65 - page_count = new_reg->num_pages; 65 + page_count = PFN_UP(new_reg->size); 66 66 while (page_count) { 67 67 int line_count = (page_count > 2047) ? 2047 : page_count; 68 68
+1 -1
drivers/gpu/drm/nouveau/nouveau_bo5039.c
··· 41 41 { 42 42 struct nouveau_mem *mem = nouveau_mem(old_reg); 43 43 struct nvif_push *push = chan->chan.push; 44 - u64 length = (new_reg->num_pages << PAGE_SHIFT); 44 + u64 length = new_reg->size; 45 45 u64 src_offset = mem->vma[0].addr; 46 46 u64 dst_offset = mem->vma[1].addr; 47 47 int src_tiled = !!mem->kind;
+1 -1
drivers/gpu/drm/nouveau/nouveau_bo74c1.c
··· 44 44 if (ret) 45 45 return ret; 46 46 47 - PUSH_NVSQ(push, NV74C1, 0x0304, new_reg->num_pages << PAGE_SHIFT, 47 + PUSH_NVSQ(push, NV74C1, 0x0304, new_reg->size, 48 48 0x0308, upper_32_bits(mem->vma[0].addr), 49 49 0x030c, lower_32_bits(mem->vma[0].addr), 50 50 0x0310, upper_32_bits(mem->vma[1].addr),
+2 -2
drivers/gpu/drm/nouveau/nouveau_bo85b5.c
··· 44 44 struct nvif_push *push = chan->chan.push; 45 45 u64 src_offset = mem->vma[0].addr; 46 46 u64 dst_offset = mem->vma[1].addr; 47 - u32 page_count = new_reg->num_pages; 47 + u32 page_count = PFN_UP(new_reg->size); 48 48 int ret; 49 49 50 - page_count = new_reg->num_pages; 50 + page_count = PFN_UP(new_reg->size); 51 51 while (page_count) { 52 52 int line_count = (page_count > 8191) ? 8191 : page_count; 53 53
+2 -2
drivers/gpu/drm/nouveau/nouveau_bo9039.c
··· 42 42 struct nouveau_mem *mem = nouveau_mem(old_reg); 43 43 u64 src_offset = mem->vma[0].addr; 44 44 u64 dst_offset = mem->vma[1].addr; 45 - u32 page_count = new_reg->num_pages; 45 + u32 page_count = PFN_UP(new_reg->size); 46 46 int ret; 47 47 48 - page_count = new_reg->num_pages; 48 + page_count = PFN_UP(new_reg->size); 49 49 while (page_count) { 50 50 int line_count = (page_count > 2047) ? 2047 : page_count; 51 51
+2 -2
drivers/gpu/drm/nouveau/nouveau_bo90b5.c
··· 37 37 struct nvif_push *push = chan->chan.push; 38 38 u64 src_offset = mem->vma[0].addr; 39 39 u64 dst_offset = mem->vma[1].addr; 40 - u32 page_count = new_reg->num_pages; 40 + u32 page_count = PFN_UP(new_reg->size); 41 41 int ret; 42 42 43 - page_count = new_reg->num_pages; 43 + page_count = PFN_UP(new_reg->size); 44 44 while (page_count) { 45 45 int line_count = (page_count > 8191) ? 8191 : page_count; 46 46
+1 -1
drivers/gpu/drm/nouveau/nouveau_boa0b5.c
··· 58 58 PITCH_IN, PAGE_SIZE, 59 59 PITCH_OUT, PAGE_SIZE, 60 60 LINE_LENGTH_IN, PAGE_SIZE, 61 - LINE_COUNT, new_reg->num_pages); 61 + LINE_COUNT, PFN_UP(new_reg->size)); 62 62 63 63 PUSH_IMMD(push, NVA0B5, LAUNCH_DMA, 64 64 NVDEF(NVA0B5, LAUNCH_DMA, DATA_TRANSFER_TYPE, NON_PIPELINED) |
+2 -3
drivers/gpu/drm/nouveau/nouveau_gem.c
··· 679 679 } 680 680 681 681 if (!nvbo->kmap.virtual) { 682 - ret = ttm_bo_kmap(&nvbo->bo, 0, nvbo->bo.resource->num_pages, 682 + ret = ttm_bo_kmap(&nvbo->bo, 0, PFN_UP(nvbo->bo.base.size), 683 683 &nvbo->kmap); 684 684 if (ret) { 685 685 NV_PRINTK(err, cli, "failed kmap for reloc\n"); ··· 868 868 if (unlikely(cmd != req->suffix0)) { 869 869 if (!nvbo->kmap.virtual) { 870 870 ret = ttm_bo_kmap(&nvbo->bo, 0, 871 - nvbo->bo.resource-> 872 - num_pages, 871 + PFN_UP(nvbo->bo.base.size), 873 872 &nvbo->kmap); 874 873 if (ret) { 875 874 WIND_RING(chan);
+2 -2
drivers/gpu/drm/nouveau/nouveau_mem.c
··· 115 115 116 116 mutex_lock(&drm->master.lock); 117 117 ret = nvif_mem_ctor_type(mmu, "ttmHostMem", cli->mem->oclass, type, PAGE_SHIFT, 118 - reg->num_pages << PAGE_SHIFT, 118 + reg->size, 119 119 &args, sizeof(args), &mem->mem); 120 120 mutex_unlock(&drm->master.lock); 121 121 return ret; ··· 128 128 struct nouveau_cli *cli = mem->cli; 129 129 struct nouveau_drm *drm = cli->drm; 130 130 struct nvif_mmu *mmu = &cli->mmu; 131 - u64 size = ALIGN(reg->num_pages << PAGE_SHIFT, 1 << page); 131 + u64 size = ALIGN(reg->size, 1 << page); 132 132 int ret; 133 133 134 134 mutex_lock(&drm->master.lock);
+1 -1
drivers/gpu/drm/nouveau/nouveau_ttm.c
··· 139 139 mem = nouveau_mem(*res); 140 140 ttm_resource_init(bo, place, *res); 141 141 ret = nvif_vmm_get(&mem->cli->vmm.vmm, PTES, false, 12, 0, 142 - (long)(*res)->num_pages << PAGE_SHIFT, &mem->vma[0]); 142 + (long)(*res)->size, &mem->vma[0]); 143 143 if (ret) { 144 144 nouveau_mem_del(man, *res); 145 145 return ret;
+35 -35
drivers/gpu/drm/panel/panel-sitronix-st7701.c
··· 19 19 20 20 /* Command2 BKx selection command */ 21 21 #define DSI_CMD2BKX_SEL 0xFF 22 + #define DSI_CMD1 0 23 + #define DSI_CMD2 BIT(4) 24 + #define DSI_CMD2BK_MASK GENMASK(3, 0) 22 25 23 26 /* Command2, BK0 commands */ 24 27 #define DSI_CMD2_BK0_PVGAMCTRL 0xB0 /* Positive Voltage Gamma Control */ ··· 41 38 #define DSI_CMD2_BK1_SPD1 0xC1 /* Source pre_drive timing set1 */ 42 39 #define DSI_CMD2_BK1_SPD2 0xC2 /* Source EQ2 Setting */ 43 40 #define DSI_CMD2_BK1_MIPISET1 0xD0 /* MIPI Setting 1 */ 44 - 45 - /* 46 - * Command2 with BK function selection. 47 - * 48 - * BIT[4].....CN2 49 - * BIT[1:0]...BKXSEL 50 - * 1:00 = CMD2BK0, Command2 BK0 51 - * 1:01 = CMD2BK1, Command2 BK1 52 - * 1:11 = CMD2BK3, Command2 BK3 53 - * 0:00 = Command2 disable 54 - */ 55 - #define DSI_CMD2BK0_SEL 0x10 56 - #define DSI_CMD2BK1_SEL 0x11 57 - #define DSI_CMD2BK3_SEL 0x13 58 - #define DSI_CMD2BKX_SEL_NONE 0x00 59 41 60 42 /* Command2, BK0 bytes */ 61 43 #define DSI_CMD2_BK0_GAMCTRL_AJ_MASK GENMASK(7, 6) ··· 179 191 return 0; 180 192 } 181 193 194 + static void st7701_switch_cmd_bkx(struct st7701 *st7701, bool cmd2, u8 bkx) 195 + { 196 + u8 val; 197 + 198 + if (cmd2) 199 + val = DSI_CMD2 | FIELD_PREP(DSI_CMD2BK_MASK, bkx); 200 + else 201 + val = DSI_CMD1; 202 + 203 + ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 0x77, 0x01, 0x00, 0x00, val); 204 + } 205 + 182 206 static void st7701_init_sequence(struct st7701 *st7701) 183 207 { 184 208 const struct st7701_panel_desc *desc = st7701->desc; ··· 208 208 msleep(st7701->sleep_delay); 209 209 210 210 /* Command2, BK0 */ 211 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 212 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BK0_SEL); 211 + st7701_switch_cmd_bkx(st7701, true, 0); 212 + 213 213 mipi_dsi_dcs_write(st7701->dsi, DSI_CMD2_BK0_PVGAMCTRL, 214 214 desc->pv_gamma, ARRAY_SIZE(desc->pv_gamma)); 215 215 mipi_dsi_dcs_write(st7701->dsi, DSI_CMD2_BK0_NVGAMCTRL, ··· 244 244 DSI_CMD2_BK0_INVSEL_ONES_MASK | 245 245 FIELD_PREP(DSI_CMD2_BK0_INVSEL_NLINV_MASK, desc->nlinv), 246 246 FIELD_PREP(DSI_CMD2_BK0_INVSEL_RTNI_MASK, 247 - DIV_ROUND_UP(mode->htotal, 16))); 247 + (clamp((u32)mode->htotal, 512U, 1008U) - 512) / 16)); 248 248 249 249 /* Command2, BK1 */ 250 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 251 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BK1_SEL); 250 + st7701_switch_cmd_bkx(st7701, true, 1); 252 251 253 252 /* Vop = 3.5375V + (VRHA[7:0] * 0.0125V) */ 254 253 ST7701_DSI(st7701, DSI_CMD2_BK1_VRHS, ··· 372 373 0x08, 0x08, 0x08, 0x40, 373 374 0x3F, 0x64); 374 375 375 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 376 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BKX_SEL_NONE); 376 + st7701_switch_cmd_bkx(st7701, false, 0); 377 377 378 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 379 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BK3_SEL); 378 + st7701_switch_cmd_bkx(st7701, true, 3); 380 379 ST7701_DSI(st7701, 0xE6, 0x7C); 381 380 ST7701_DSI(st7701, 0xE8, 0x00, 0x0E); 382 381 383 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 384 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BKX_SEL_NONE); 382 + st7701_switch_cmd_bkx(st7701, false, 0); 385 383 ST7701_DSI(st7701, 0x11); 386 384 msleep(120); 387 385 388 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 389 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BK3_SEL); 386 + st7701_switch_cmd_bkx(st7701, true, 3); 390 387 ST7701_DSI(st7701, 0xE8, 0x00, 0x0C); 391 388 msleep(10); 392 389 ST7701_DSI(st7701, 0xE8, 0x00, 0x00); 393 390 394 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 395 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BKX_SEL_NONE); 391 + st7701_switch_cmd_bkx(st7701, false, 0); 396 392 ST7701_DSI(st7701, 0x11); 397 393 msleep(120); 398 394 ST7701_DSI(st7701, 0xE8, 0x00, 0x00); 399 395 400 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 401 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BKX_SEL_NONE); 396 + st7701_switch_cmd_bkx(st7701, false, 0); 402 397 403 398 ST7701_DSI(st7701, 0x3A, 0x70); 404 399 } ··· 419 426 st7701->desc->gip_sequence(st7701); 420 427 421 428 /* Disable Command2 */ 422 - ST7701_DSI(st7701, DSI_CMD2BKX_SEL, 423 - 0x77, 0x01, 0x00, 0x00, DSI_CMD2BKX_SEL_NONE); 429 + st7701_switch_cmd_bkx(st7701, false, 0); 424 430 425 431 return 0; 426 432 } ··· 754 762 st7701->dsi = dsi; 755 763 st7701->desc = desc; 756 764 757 - return mipi_dsi_attach(dsi); 765 + ret = mipi_dsi_attach(dsi); 766 + if (ret) 767 + goto err_attach; 768 + 769 + return 0; 770 + 771 + err_attach: 772 + drm_panel_remove(&st7701->panel); 773 + return ret; 758 774 } 759 775 760 776 static void st7701_dsi_remove(struct mipi_dsi_device *dsi)
+5 -2
drivers/gpu/drm/radeon/radeon_cs.c
··· 400 400 struct radeon_bo_list *lb = list_entry(b, struct radeon_bo_list, tv.head); 401 401 402 402 /* Sort A before B if A is smaller. */ 403 - return (int)la->robj->tbo.resource->num_pages - 404 - (int)lb->robj->tbo.resource->num_pages; 403 + if (la->robj->tbo.base.size > lb->robj->tbo.base.size) 404 + return 1; 405 + if (la->robj->tbo.base.size < lb->robj->tbo.base.size) 406 + return -1; 407 + return 0; 405 408 } 406 409 407 410 /**
+2 -2
drivers/gpu/drm/radeon/radeon_object.c
··· 232 232 } 233 233 return 0; 234 234 } 235 - r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.resource->num_pages, &bo->kmap); 235 + r = ttm_bo_kmap(&bo->tbo, 0, PFN_UP(bo->tbo.base.size), &bo->kmap); 236 236 if (r) { 237 237 return r; 238 238 } ··· 737 737 if (bo->resource->mem_type != TTM_PL_VRAM) 738 738 return 0; 739 739 740 - size = bo->resource->num_pages << PAGE_SHIFT; 740 + size = bo->resource->size; 741 741 offset = bo->resource->start << PAGE_SHIFT; 742 742 if ((offset + size) <= rdev->mc.visible_vram_size) 743 743 return 0;
+1 -1
drivers/gpu/drm/radeon/radeon_trace.h
··· 22 22 23 23 TP_fast_assign( 24 24 __entry->bo = bo; 25 - __entry->pages = bo->tbo.resource->num_pages; 25 + __entry->pages = PFN_UP(bo->tbo.resource->size); 26 26 ), 27 27 TP_printk("bo=%p, pages=%u", __entry->bo, __entry->pages) 28 28 );
+2 -2
drivers/gpu/drm/radeon/radeon_ttm.c
··· 181 181 182 182 BUILD_BUG_ON((PAGE_SIZE % RADEON_GPU_PAGE_SIZE) != 0); 183 183 184 - num_pages = new_mem->num_pages * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); 184 + num_pages = PFN_UP(new_mem->size) * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); 185 185 fence = radeon_copy(rdev, old_start, new_start, num_pages, bo->base.resv); 186 186 if (IS_ERR(fence)) 187 187 return PTR_ERR(fence); ··· 268 268 static int radeon_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *mem) 269 269 { 270 270 struct radeon_device *rdev = radeon_get_rdev(bdev); 271 - size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT; 271 + size_t bus_size = (size_t)mem->size; 272 272 273 273 switch (mem->mem_type) { 274 274 case TTM_PL_SYSTEM:
+1 -7
drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
··· 364 364 return readl(dsi->base + reg); 365 365 } 366 366 367 - static inline void dsi_update_bits(struct dw_mipi_dsi_rockchip *dsi, u32 reg, 368 - u32 mask, u32 val) 369 - { 370 - dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val); 371 - } 372 - 373 367 static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi_rockchip *dsi, 374 368 u8 test_code, 375 369 u8 test_data) ··· 1207 1213 return i; 1208 1214 } 1209 1215 1210 - ret = pm_runtime_get_sync(dsi->dev); 1216 + ret = pm_runtime_resume_and_get(dsi->dev); 1211 1217 if (ret < 0) { 1212 1218 DRM_DEV_ERROR(dsi->dev, "failed to enable device: %d\n", ret); 1213 1219 return ret;
-43
drivers/gpu/drm/rockchip/rockchip_drm_fb.c
··· 25 25 .dirty = drm_atomic_helper_dirtyfb, 26 26 }; 27 27 28 - static struct drm_framebuffer * 29 - rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd, 30 - struct drm_gem_object **obj, unsigned int num_planes) 31 - { 32 - struct drm_framebuffer *fb; 33 - int ret; 34 - int i; 35 - 36 - fb = kzalloc(sizeof(*fb), GFP_KERNEL); 37 - if (!fb) 38 - return ERR_PTR(-ENOMEM); 39 - 40 - drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd); 41 - 42 - for (i = 0; i < num_planes; i++) 43 - fb->obj[i] = obj[i]; 44 - 45 - ret = drm_framebuffer_init(dev, fb, &rockchip_drm_fb_funcs); 46 - if (ret) { 47 - DRM_DEV_ERROR(dev->dev, 48 - "Failed to initialize framebuffer: %d\n", 49 - ret); 50 - kfree(fb); 51 - return ERR_PTR(ret); 52 - } 53 - 54 - return fb; 55 - } 56 - 57 28 static const struct drm_mode_config_helper_funcs rockchip_mode_config_helpers = { 58 29 .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm, 59 30 }; ··· 76 105 .atomic_check = drm_atomic_helper_check, 77 106 .atomic_commit = drm_atomic_helper_commit, 78 107 }; 79 - 80 - struct drm_framebuffer * 81 - rockchip_drm_framebuffer_init(struct drm_device *dev, 82 - const struct drm_mode_fb_cmd2 *mode_cmd, 83 - struct drm_gem_object *obj) 84 - { 85 - struct drm_framebuffer *fb; 86 - 87 - fb = rockchip_fb_alloc(dev, mode_cmd, &obj, 1); 88 - if (IS_ERR(fb)) 89 - return ERR_CAST(fb); 90 - 91 - return fb; 92 - } 93 108 94 109 void rockchip_drm_mode_config_init(struct drm_device *dev) 95 110 {
-6
drivers/gpu/drm/rockchip/rockchip_drm_fb.h
··· 7 7 #ifndef _ROCKCHIP_DRM_FB_H 8 8 #define _ROCKCHIP_DRM_FB_H 9 9 10 - struct drm_framebuffer * 11 - rockchip_drm_framebuffer_init(struct drm_device *dev, 12 - const struct drm_mode_fb_cmd2 *mode_cmd, 13 - struct drm_gem_object *obj); 14 - void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb); 15 - 16 10 void rockchip_drm_mode_config_init(struct drm_device *dev); 17 11 #endif /* _ROCKCHIP_DRM_FB_H */
+2 -2
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
··· 602 602 struct vop *vop = to_vop(crtc); 603 603 int ret, i; 604 604 605 - ret = pm_runtime_get_sync(vop->dev); 605 + ret = pm_runtime_resume_and_get(vop->dev); 606 606 if (ret < 0) { 607 607 DRM_DEV_ERROR(vop->dev, "failed to get pm runtime: %d\n", ret); 608 608 return ret; ··· 1983 1983 return PTR_ERR(vop->dclk); 1984 1984 } 1985 1985 1986 - ret = pm_runtime_get_sync(vop->dev); 1986 + ret = pm_runtime_resume_and_get(vop->dev); 1987 1987 if (ret < 0) { 1988 1988 DRM_DEV_ERROR(vop->dev, "failed to get pm runtime: %d\n", ret); 1989 1989 return ret;
+1 -1
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
··· 822 822 { 823 823 int ret; 824 824 825 - ret = pm_runtime_get_sync(vop2->dev); 825 + ret = pm_runtime_resume_and_get(vop2->dev); 826 826 if (ret < 0) { 827 827 drm_err(vop2->drm, "failed to get pm runtime: %d\n", ret); 828 828 return;
+7 -3
drivers/gpu/drm/rockchip/rockchip_lvds.c
··· 152 152 DRM_DEV_ERROR(lvds->dev, "failed to enable lvds pclk %d\n", ret); 153 153 return ret; 154 154 } 155 - ret = pm_runtime_get_sync(lvds->dev); 155 + ret = pm_runtime_resume_and_get(lvds->dev); 156 156 if (ret < 0) { 157 157 DRM_DEV_ERROR(lvds->dev, "failed to get pm runtime: %d\n", ret); 158 158 clk_disable(lvds->pclk); ··· 336 336 { 337 337 int ret; 338 338 339 - ret = pm_runtime_get_sync(lvds->dev); 339 + ret = pm_runtime_resume_and_get(lvds->dev); 340 340 if (ret < 0) { 341 341 DRM_DEV_ERROR(lvds->dev, "failed to get pm runtime: %d\n", ret); 342 342 return ret; 343 343 } 344 344 345 345 /* Enable LVDS mode */ 346 - return regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, 346 + ret = regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, 347 347 PX30_LVDS_MODE_EN(1) | PX30_LVDS_P2S_EN(1), 348 348 PX30_LVDS_MODE_EN(1) | PX30_LVDS_P2S_EN(1)); 349 + if (ret) 350 + pm_runtime_put(lvds->dev); 351 + 352 + return ret; 349 353 } 350 354 351 355 static void px30_lvds_poweroff(struct rockchip_lvds *lvds)
+1 -1
drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
··· 188 188 .base = 0x1800, 189 189 .layer_sel_id = 2, 190 190 .supported_rotations = DRM_MODE_REFLECT_Y, 191 - .type = DRM_PLANE_TYPE_OVERLAY, 191 + .type = DRM_PLANE_TYPE_PRIMARY, 192 192 .max_upscale_factor = 8, 193 193 .max_downscale_factor = 8, 194 194 .dly = { 20, 47, 41 },
+4 -2
drivers/gpu/drm/tests/drm_buddy_test.c
··· 726 726 drm_buddy_fini(&mm); 727 727 } 728 728 729 - static int drm_buddy_init_test(struct kunit *test) 729 + static int drm_buddy_suite_init(struct kunit_suite *suite) 730 730 { 731 731 while (!random_seed) 732 732 random_seed = get_random_u32(); 733 + 734 + kunit_info(suite, "Testing DRM buddy manager, with random_seed=0x%x\n", random_seed); 733 735 734 736 return 0; 735 737 } ··· 748 746 749 747 static struct kunit_suite drm_buddy_test_suite = { 750 748 .name = "drm_buddy", 751 - .init = drm_buddy_init_test, 749 + .suite_init = drm_buddy_suite_init, 752 750 .test_cases = drm_buddy_tests, 753 751 }; 754 752
+6 -2
drivers/gpu/drm/tests/drm_mm_test.c
··· 2209 2209 vfree(nodes); 2210 2210 } 2211 2211 2212 - static int drm_mm_init_test(struct kunit *test) 2212 + static int drm_mm_suite_init(struct kunit_suite *suite) 2213 2213 { 2214 2214 while (!random_seed) 2215 2215 random_seed = get_random_u32(); 2216 + 2217 + kunit_info(suite, 2218 + "Testing DRM range manager, with random_seed=0x%x max_iterations=%u max_prime=%u\n", 2219 + random_seed, max_iterations, max_prime); 2216 2220 2217 2221 return 0; 2218 2222 } ··· 2250 2246 2251 2247 static struct kunit_suite drm_mm_test_suite = { 2252 2248 .name = "drm_mm", 2253 - .init = drm_mm_init_test, 2249 + .suite_init = drm_mm_suite_init, 2254 2250 .test_cases = drm_mm_tests, 2255 2251 }; 2256 2252
-3
drivers/gpu/drm/ttm/ttm_bo.c
··· 51 51 struct ttm_resource_manager *man; 52 52 int i, mem_type; 53 53 54 - drm_printf(&p, "No space for %p (%lu pages, %zuK, %zuM)\n", 55 - bo, bo->resource->num_pages, bo->base.size >> 10, 56 - bo->base.size >> 20); 57 54 for (i = 0; i < placement->num_placement; i++) { 58 55 mem_type = placement->placement[i].mem_type; 59 56 drm_printf(&p, " placement[%d]=0x%08X (%d)\n",
+3 -3
drivers/gpu/drm/ttm/ttm_bo_util.c
··· 173 173 174 174 clear = src_iter->ops->maps_tt && (!ttm || !ttm_tt_is_populated(ttm)); 175 175 if (!(clear && ttm && !(ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC))) 176 - ttm_move_memcpy(clear, dst_mem->num_pages, dst_iter, src_iter); 176 + ttm_move_memcpy(clear, ttm->num_pages, dst_iter, src_iter); 177 177 178 178 if (!src_iter->ops->maps_tt) 179 179 ttm_kmap_iter_linear_io_fini(&_src_iter.io, bdev, src_mem); ··· 357 357 358 358 map->virtual = NULL; 359 359 map->bo = bo; 360 - if (num_pages > bo->resource->num_pages) 360 + if (num_pages > PFN_UP(bo->resource->size)) 361 361 return -EINVAL; 362 - if ((start_page + num_pages) > bo->resource->num_pages) 362 + if ((start_page + num_pages) > PFN_UP(bo->resource->size)) 363 363 return -EINVAL; 364 364 365 365 ret = ttm_mem_io_reserve(bo->bdev, bo->resource);
+2 -2
drivers/gpu/drm/ttm/ttm_bo_vm.c
··· 217 217 page_last = vma_pages(vma) + vma->vm_pgoff - 218 218 drm_vma_node_start(&bo->base.vma_node); 219 219 220 - if (unlikely(page_offset >= bo->resource->num_pages)) 220 + if (unlikely(page_offset >= PFN_UP(bo->base.size))) 221 221 return VM_FAULT_SIGBUS; 222 222 223 223 prot = ttm_io_prot(bo, bo->resource, prot); ··· 412 412 << PAGE_SHIFT); 413 413 int ret; 414 414 415 - if (len < 1 || (offset + len) >> PAGE_SHIFT > bo->resource->num_pages) 415 + if (len < 1 || (offset + len) > bo->base.size) 416 416 return -EIO; 417 417 418 418 ret = ttm_bo_reserve(bo, true, false, NULL);
+1 -1
drivers/gpu/drm/ttm/ttm_range_manager.c
··· 83 83 84 84 spin_lock(&rman->lock); 85 85 ret = drm_mm_insert_node_in_range(mm, &node->mm_nodes[0], 86 - node->base.num_pages, 86 + PFN_UP(node->base.size), 87 87 bo->page_alignment, 0, 88 88 place->fpfn, lpfn, mode); 89 89 spin_unlock(&rman->lock);
+6 -8
drivers/gpu/drm/ttm/ttm_resource.c
··· 177 177 struct ttm_resource_manager *man; 178 178 179 179 res->start = 0; 180 - res->num_pages = PFN_UP(bo->base.size); 180 + res->size = bo->base.size; 181 181 res->mem_type = place->mem_type; 182 182 res->placement = place->flags; 183 183 res->bus.addr = NULL; ··· 192 192 list_add_tail(&res->lru, &bo->bdev->pinned); 193 193 else 194 194 list_add_tail(&res->lru, &man->lru[bo->priority]); 195 - man->usage += res->num_pages << PAGE_SHIFT; 195 + man->usage += res->size; 196 196 spin_unlock(&bo->bdev->lru_lock); 197 197 } 198 198 EXPORT_SYMBOL(ttm_resource_init); ··· 214 214 215 215 spin_lock(&bdev->lru_lock); 216 216 list_del_init(&res->lru); 217 - man->usage -= res->num_pages << PAGE_SHIFT; 217 + man->usage -= res->size; 218 218 spin_unlock(&bdev->lru_lock); 219 219 } 220 220 EXPORT_SYMBOL(ttm_resource_fini); ··· 665 665 iosys_map_set_vaddr(&iter_io->dmap, mem->bus.addr); 666 666 iter_io->needs_unmap = false; 667 667 } else { 668 - size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT; 669 - 670 668 iter_io->needs_unmap = true; 671 669 memset(&iter_io->dmap, 0, sizeof(iter_io->dmap)); 672 670 if (mem->bus.caching == ttm_write_combined) 673 671 iosys_map_set_vaddr_iomem(&iter_io->dmap, 674 672 ioremap_wc(mem->bus.offset, 675 - bus_size)); 673 + mem->size)); 676 674 else if (mem->bus.caching == ttm_cached) 677 675 iosys_map_set_vaddr(&iter_io->dmap, 678 - memremap(mem->bus.offset, bus_size, 676 + memremap(mem->bus.offset, mem->size, 679 677 MEMREMAP_WB | 680 678 MEMREMAP_WT | 681 679 MEMREMAP_WC)); ··· 682 684 if (iosys_map_is_null(&iter_io->dmap)) 683 685 iosys_map_set_vaddr_iomem(&iter_io->dmap, 684 686 ioremap(mem->bus.offset, 685 - bus_size)); 687 + mem->size)); 686 688 687 689 if (iosys_map_is_null(&iter_io->dmap)) { 688 690 ret = -ENOMEM;
+16
drivers/gpu/drm/vc4/vc4_drv.h
··· 326 326 327 327 struct clk *core_clk; 328 328 329 + unsigned long max_core_rate; 330 + 329 331 /* Memory manager for CRTCs to allocate space in the display 330 332 * list. Units are dwords. 331 333 */ ··· 339 337 struct drm_mm_node mitchell_netravali_filter; 340 338 341 339 struct debugfs_regset32 regset; 340 + 341 + /* 342 + * Even if HDMI0 on the RPi4 can output modes requiring a pixel 343 + * rate higher than 297MHz, it needs some adjustments in the 344 + * config.txt file to be able to do so and thus won't always be 345 + * available. 346 + */ 347 + bool vc5_hdmi_enable_hdmi_20; 348 + 349 + /* 350 + * 4096x2160@60 requires a core overclock to work, so register 351 + * whether that is sufficient. 352 + */ 353 + bool vc5_hdmi_enable_4096by2160; 342 354 }; 343 355 344 356 struct vc4_plane {
+13 -12
drivers/gpu/drm/vc4/vc4_hdmi.c
··· 459 459 static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) 460 460 { 461 461 struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); 462 + struct vc4_dev *vc4 = to_vc4_dev(connector->dev); 462 463 int ret = 0; 463 464 struct edid *edid; 464 465 ··· 483 482 ret = drm_add_edid_modes(connector, edid); 484 483 kfree(edid); 485 484 486 - if (vc4_hdmi->disable_4kp60) { 485 + if (!vc4->hvs->vc5_hdmi_enable_hdmi_20) { 487 486 struct drm_device *drm = connector->dev; 488 487 const struct drm_display_mode *mode; 489 488 ··· 1753 1752 1754 1753 static enum drm_mode_status 1755 1754 vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi, 1755 + const struct drm_display_mode *mode, 1756 1756 unsigned long long clock) 1757 1757 { 1758 1758 const struct drm_connector *connector = &vc4_hdmi->connector; 1759 1759 const struct drm_display_info *info = &connector->display_info; 1760 + struct vc4_dev *vc4 = to_vc4_dev(connector->dev); 1760 1761 1761 1762 if (clock > vc4_hdmi->variant->max_pixel_clock) 1762 1763 return MODE_CLOCK_HIGH; 1763 1764 1764 - if (vc4_hdmi->disable_4kp60 && clock > HDMI_14_MAX_TMDS_CLK) 1765 + if (!vc4->hvs->vc5_hdmi_enable_hdmi_20 && clock > HDMI_14_MAX_TMDS_CLK) 1766 + return MODE_CLOCK_HIGH; 1767 + 1768 + /* 4096x2160@60 is not reliable without overclocking core */ 1769 + if (!vc4->hvs->vc5_hdmi_enable_4096by2160 && 1770 + mode->hdisplay > 3840 && mode->vdisplay >= 2160 && 1771 + drm_mode_vrefresh(mode) >= 50) 1765 1772 return MODE_CLOCK_HIGH; 1766 1773 1767 1774 if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000)) ··· 1806 1797 unsigned long long clock; 1807 1798 1808 1799 clock = vc4_hdmi_encoder_compute_mode_clock(mode, bpc, fmt); 1809 - if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, clock) != MODE_OK) 1800 + if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode, clock) != MODE_OK) 1810 1801 return -EINVAL; 1811 1802 1812 1803 vc4_state->tmds_char_rate = clock; ··· 1969 1960 (mode->hsync_end % 2) || (mode->htotal % 2))) 1970 1961 return MODE_H_ILLEGAL; 1971 1962 1972 - return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode->clock * 1000); 1963 + return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode, mode->clock * 1000); 1973 1964 } 1974 1965 1975 1966 static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = { ··· 3464 3455 3465 3456 vc4_hdmi->disable_wifi_frequencies = 3466 3457 of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence"); 3467 - 3468 - if (variant->max_pixel_clock == 600000000) { 3469 - struct vc4_dev *vc4 = to_vc4_dev(drm); 3470 - long max_rate = clk_round_rate(vc4->hvs->core_clk, 550000000); 3471 - 3472 - if (max_rate < 550000000) 3473 - vc4_hdmi->disable_4kp60 = true; 3474 - } 3475 3458 3476 3459 ret = devm_pm_runtime_enable(dev); 3477 3460 if (ret)
-8
drivers/gpu/drm/vc4/vc4_hdmi.h
··· 156 156 */ 157 157 bool disable_wifi_frequencies; 158 158 159 - /* 160 - * Even if HDMI0 on the RPi4 can output modes requiring a pixel 161 - * rate higher than 297MHz, it needs some adjustments in the 162 - * config.txt file to be able to do so and thus won't always be 163 - * available. 164 - */ 165 - bool disable_4kp60; 166 - 167 159 struct cec_adapter *cec_adap; 168 160 struct cec_msg cec_rx_msg; 169 161 bool cec_tx_ok;
+26
drivers/gpu/drm/vc4/vc4_hvs.c
··· 28 28 #include <drm/drm_drv.h> 29 29 #include <drm/drm_vblank.h> 30 30 31 + #include <soc/bcm2835/raspberrypi-firmware.h> 32 + 31 33 #include "vc4_drv.h" 32 34 #include "vc4_regs.h" 33 35 ··· 793 791 hvs->regset.nregs = ARRAY_SIZE(hvs_regs); 794 792 795 793 if (vc4->is_vc5) { 794 + struct rpi_firmware *firmware; 795 + struct device_node *node; 796 + unsigned int max_rate; 797 + 798 + node = rpi_firmware_find_node(); 799 + if (!node) 800 + return -EINVAL; 801 + 802 + firmware = rpi_firmware_get(node); 803 + of_node_put(node); 804 + if (!firmware) 805 + return -EPROBE_DEFER; 806 + 796 807 hvs->core_clk = devm_clk_get(&pdev->dev, NULL); 797 808 if (IS_ERR(hvs->core_clk)) { 798 809 dev_err(&pdev->dev, "Couldn't get core clock\n"); 799 810 return PTR_ERR(hvs->core_clk); 800 811 } 812 + 813 + max_rate = rpi_firmware_clk_get_max_rate(firmware, 814 + RPI_FIRMWARE_CORE_CLK_ID); 815 + rpi_firmware_put(firmware); 816 + if (max_rate >= 550000000) 817 + hvs->vc5_hdmi_enable_hdmi_20 = true; 818 + 819 + if (max_rate >= 600000000) 820 + hvs->vc5_hdmi_enable_4096by2160 = true; 821 + 822 + hvs->max_core_rate = max_rate; 801 823 802 824 ret = clk_prepare_enable(hvs->core_clk); 803 825 if (ret) {
+8 -5
drivers/gpu/drm/vc4/vc4_kms.c
··· 396 396 if (vc4->is_vc5) { 397 397 unsigned long state_rate = max(old_hvs_state->core_clock_rate, 398 398 new_hvs_state->core_clock_rate); 399 - unsigned long core_rate = max_t(unsigned long, 400 - 500000000, state_rate); 399 + unsigned long core_rate = clamp_t(unsigned long, state_rate, 400 + 500000000, hvs->max_core_rate); 401 401 402 402 drm_dbg(dev, "Raising the core clock at %lu Hz\n", core_rate); 403 403 ··· 431 431 drm_atomic_helper_cleanup_planes(dev, state); 432 432 433 433 if (vc4->is_vc5) { 434 - drm_dbg(dev, "Running the core clock at %lu Hz\n", 435 - new_hvs_state->core_clock_rate); 434 + unsigned long core_rate = min_t(unsigned long, 435 + hvs->max_core_rate, 436 + new_hvs_state->core_clock_rate); 437 + 438 + drm_dbg(dev, "Running the core clock at %lu Hz\n", core_rate); 436 439 437 440 /* 438 441 * Request a clock rate based on the current HVS 439 442 * requirements. 440 443 */ 441 - WARN_ON(clk_set_min_rate(hvs->core_clk, new_hvs_state->core_clock_rate)); 444 + WARN_ON(clk_set_min_rate(hvs->core_clk, core_rate)); 442 445 443 446 drm_dbg(dev, "Core clock actual rate: %lu Hz\n", 444 447 clk_get_rate(hvs->core_clk));
+2 -2
drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
··· 483 483 d.src_addr = NULL; 484 484 d.dst_pages = dst->ttm->pages; 485 485 d.src_pages = src->ttm->pages; 486 - d.dst_num_pages = dst->resource->num_pages; 487 - d.src_num_pages = src->resource->num_pages; 486 + d.dst_num_pages = PFN_UP(dst->resource->size); 487 + d.src_num_pages = PFN_UP(src->resource->size); 488 488 d.dst_prot = ttm_io_prot(dst, dst->resource, PAGE_KERNEL); 489 489 d.src_prot = ttm_io_prot(src, src->resource, PAGE_KERNEL); 490 490 d.diff = diff;
+3 -3
drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
··· 194 194 int ret = 0; 195 195 196 196 place = vmw_vram_placement.placement[0]; 197 - place.lpfn = bo->resource->num_pages; 197 + place.lpfn = PFN_UP(bo->resource->size); 198 198 placement.num_placement = 1; 199 199 placement.placement = &place; 200 200 placement.num_busy_placement = 1; ··· 211 211 * that situation. 212 212 */ 213 213 if (bo->resource->mem_type == TTM_PL_VRAM && 214 - bo->resource->start < bo->resource->num_pages && 214 + bo->resource->start < PFN_UP(bo->resource->size) && 215 215 bo->resource->start > 0 && 216 216 buf->base.pin_count == 0) { 217 217 ctx.interruptible = false; ··· 352 352 if (virtual) 353 353 return virtual; 354 354 355 - ret = ttm_bo_kmap(bo, 0, bo->resource->num_pages, &vbo->map); 355 + ret = ttm_bo_kmap(bo, 0, PFN_UP(bo->base.size), &vbo->map); 356 356 if (ret) 357 357 DRM_ERROR("Buffer object map failed: %d.\n", ret); 358 358
+1 -1
drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
··· 443 443 * Do a page by page copy of COTables. This eliminates slow vmap()s. 444 444 * This should really be a TTM utility. 445 445 */ 446 - for (i = 0; i < old_bo->resource->num_pages; ++i) { 446 + for (i = 0; i < PFN_UP(old_bo->resource->size); ++i) { 447 447 bool dummy; 448 448 449 449 ret = ttm_bo_kmap(old_bo, i, 1, &old_map);
+4
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
··· 98 98 #define VMW_RES_SHADER ttm_driver_type4 99 99 #define VMW_RES_HT_ORDER 12 100 100 101 + #define VMW_CURSOR_SNOOP_FORMAT SVGA3D_A8R8G8B8 102 + #define VMW_CURSOR_SNOOP_WIDTH 64 103 + #define VMW_CURSOR_SNOOP_HEIGHT 64 104 + 101 105 #define MKSSTAT_CAPACITY_LOG2 5U 102 106 #define MKSSTAT_CAPACITY (1U << MKSSTAT_CAPACITY_LOG2) 103 107
+1 -1
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
··· 1047 1047 1048 1048 if (unlikely(new_query_bo != sw_context->cur_query_bo)) { 1049 1049 1050 - if (unlikely(new_query_bo->base.resource->num_pages > 4)) { 1050 + if (unlikely(PFN_UP(new_query_bo->base.resource->size) > 4)) { 1051 1051 VMW_DEBUG_USER("Query buffer too large.\n"); 1052 1052 return -EINVAL; 1053 1053 }
+3 -3
drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
··· 71 71 spin_lock(&gman->lock); 72 72 73 73 if (gman->max_gmr_pages > 0) { 74 - gman->used_gmr_pages += (*res)->num_pages; 74 + gman->used_gmr_pages += PFN_UP((*res)->size); 75 75 /* 76 76 * Because the graphics memory is a soft limit we can try to 77 77 * expand it instead of letting the userspace apps crash. ··· 114 114 return 0; 115 115 116 116 nospace: 117 - gman->used_gmr_pages -= (*res)->num_pages; 117 + gman->used_gmr_pages -= PFN_UP((*res)->size); 118 118 spin_unlock(&gman->lock); 119 119 ida_free(&gman->gmr_ida, id); 120 120 ttm_resource_fini(man, *res); ··· 129 129 130 130 ida_free(&gman->gmr_ida, res->start); 131 131 spin_lock(&gman->lock); 132 - gman->used_gmr_pages -= res->num_pages; 132 + gman->used_gmr_pages -= PFN_UP(res->size); 133 133 spin_unlock(&gman->lock); 134 134 ttm_resource_fini(man, res); 135 135 kfree(res);
+18 -12
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
··· 25 25 * 26 26 **************************************************************************/ 27 27 28 + #include "vmwgfx_kms.h" 29 + #include "vmw_surface_cache.h" 30 + 28 31 #include <drm/drm_atomic.h> 29 32 #include <drm/drm_atomic_helper.h> 30 33 #include <drm/drm_damage_helper.h> 31 34 #include <drm/drm_fourcc.h> 32 35 #include <drm/drm_rect.h> 33 36 #include <drm/drm_sysfs.h> 34 - 35 - #include "vmwgfx_kms.h" 36 37 37 38 void vmw_du_cleanup(struct vmw_display_unit *du) 38 39 { ··· 352 351 spin_unlock(&dev_priv->cursor_lock); 353 352 } 354 353 355 - 356 354 void vmw_kms_cursor_snoop(struct vmw_surface *srf, 357 355 struct ttm_object_file *tfile, 358 356 struct ttm_buffer_object *bo, ··· 369 369 SVGA3dCmdSurfaceDMA dma; 370 370 } *cmd; 371 371 int i, ret; 372 + const struct SVGA3dSurfaceDesc *desc = 373 + vmw_surface_get_desc(VMW_CURSOR_SNOOP_FORMAT); 374 + const u32 image_pitch = VMW_CURSOR_SNOOP_WIDTH * desc->pitchBytesPerBlock; 372 375 373 376 cmd = container_of(header, struct vmw_dma_cmd, header); 374 377 ··· 396 393 if (cmd->dma.guest.ptr.offset % PAGE_SIZE || 397 394 box->x != 0 || box->y != 0 || box->z != 0 || 398 395 box->srcx != 0 || box->srcy != 0 || box->srcz != 0 || 399 - box->d != 1 || box_count != 1) { 396 + box->d != 1 || box_count != 1 || 397 + box->w > VMW_CURSOR_SNOOP_WIDTH || box->h > VMW_CURSOR_SNOOP_HEIGHT) { 400 398 /* TODO handle none page aligned offsets */ 401 399 /* TODO handle more dst & src != 0 */ 402 400 /* TODO handle more then one copy */ ··· 411 407 } 412 408 413 409 kmap_offset = cmd->dma.guest.ptr.offset >> PAGE_SHIFT; 414 - kmap_num = (64*64*4) >> PAGE_SHIFT; 410 + kmap_num = (VMW_CURSOR_SNOOP_HEIGHT*image_pitch) >> PAGE_SHIFT; 415 411 416 412 ret = ttm_bo_reserve(bo, true, false, NULL); 417 413 if (unlikely(ret != 0)) { ··· 425 421 426 422 virtual = ttm_kmap_obj_virtual(&map, &dummy); 427 423 428 - if (box->w == 64 && cmd->dma.guest.pitch == 64*4) { 429 - memcpy(srf->snooper.image, virtual, 64*64*4); 424 + if (box->w == VMW_CURSOR_SNOOP_WIDTH && cmd->dma.guest.pitch == image_pitch) { 425 + memcpy(srf->snooper.image, virtual, 426 + VMW_CURSOR_SNOOP_HEIGHT*image_pitch); 430 427 } else { 431 428 /* Image is unsigned pointer. */ 432 429 for (i = 0; i < box->h; i++) 433 - memcpy(srf->snooper.image + i * 64, 430 + memcpy(srf->snooper.image + i * image_pitch, 434 431 virtual + i * cmd->dma.guest.pitch, 435 - box->w * 4); 432 + box->w * desc->pitchBytesPerBlock); 436 433 } 437 434 438 435 srf->snooper.age++; ··· 484 479 du->cursor_age = du->cursor_surface->snooper.age; 485 480 vmw_send_define_cursor_cmd(dev_priv, 486 481 du->cursor_surface->snooper.image, 487 - 64, 64, 482 + VMW_CURSOR_SNOOP_WIDTH, 483 + VMW_CURSOR_SNOOP_HEIGHT, 488 484 du->hotspot_x + du->core_hotspot_x, 489 485 du->hotspot_y + du->core_hotspot_y); 490 486 } ··· 1811 1805 if (IS_ERR(vfb)) { 1812 1806 ret = PTR_ERR(vfb); 1813 1807 goto err_out; 1814 - } 1808 + } 1815 1809 1816 1810 err_out: 1817 1811 /* vmw_user_lookup_handle takes one ref so does new_fb */ ··· 2331 2325 if (ret == -EDEADLK) { 2332 2326 drm_modeset_backoff(&ctx); 2333 2327 goto retry; 2334 - } 2328 + } 2335 2329 goto out_fini; 2336 2330 } 2337 2331 }
+3 -3
drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c
··· 230 230 int vmw_bo_dirty_add(struct vmw_buffer_object *vbo) 231 231 { 232 232 struct vmw_bo_dirty *dirty = vbo->dirty; 233 - pgoff_t num_pages = vbo->base.resource->num_pages; 233 + pgoff_t num_pages = PFN_UP(vbo->base.resource->size); 234 234 size_t size; 235 235 int ret; 236 236 ··· 395 395 return ret; 396 396 397 397 page_offset = vmf->pgoff - drm_vma_node_start(&bo->base.vma_node); 398 - if (unlikely(page_offset >= bo->resource->num_pages)) { 398 + if (unlikely(page_offset >= PFN_UP(bo->resource->size))) { 399 399 ret = VM_FAULT_SIGBUS; 400 400 goto out_unlock; 401 401 } ··· 438 438 439 439 page_offset = vmf->pgoff - 440 440 drm_vma_node_start(&bo->base.vma_node); 441 - if (page_offset >= bo->resource->num_pages || 441 + if (page_offset >= PFN_UP(bo->resource->size) || 442 442 vmw_resources_clean(vbo, page_offset, 443 443 page_offset + PAGE_SIZE, 444 444 &allowed_prefault)) {
+9 -5
drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
··· 815 815 res->backup_size = cur_bo_offset; 816 816 if (metadata->scanout && 817 817 metadata->num_sizes == 1 && 818 - metadata->sizes[0].width == 64 && 819 - metadata->sizes[0].height == 64 && 820 - metadata->format == SVGA3D_A8R8G8B8) { 821 - 822 - srf->snooper.image = kzalloc(64 * 64 * 4, GFP_KERNEL); 818 + metadata->sizes[0].width == VMW_CURSOR_SNOOP_WIDTH && 819 + metadata->sizes[0].height == VMW_CURSOR_SNOOP_HEIGHT && 820 + metadata->format == VMW_CURSOR_SNOOP_FORMAT) { 821 + const struct SVGA3dSurfaceDesc *desc = 822 + vmw_surface_get_desc(VMW_CURSOR_SNOOP_FORMAT); 823 + const u32 cursor_size_bytes = VMW_CURSOR_SNOOP_WIDTH * 824 + VMW_CURSOR_SNOOP_HEIGHT * 825 + desc->pitchBytesPerBlock; 826 + srf->snooper.image = kzalloc(cursor_size_bytes, GFP_KERNEL); 823 827 if (!srf->snooper.image) { 824 828 DRM_ERROR("Failed to allocate cursor_image\n"); 825 829 ret = -ENOMEM;
+2 -2
include/drm/ttm/ttm_resource.h
··· 197 197 * struct ttm_resource 198 198 * 199 199 * @start: Start of the allocation. 200 - * @num_pages: Actual size of resource in pages. 200 + * @size: Actual size of resource in bytes. 201 201 * @mem_type: Resource type of the allocation. 202 202 * @placement: Placement flags. 203 203 * @bus: Placement on io bus accessible to the CPU ··· 208 208 */ 209 209 struct ttm_resource { 210 210 unsigned long start; 211 - unsigned long num_pages; 211 + size_t size; 212 212 uint32_t mem_type; 213 213 uint32_t placement; 214 214 struct ttm_bus_placement bus;
+1 -1
include/drm/ttm/ttm_tt.h
··· 88 88 #define TTM_TT_FLAG_EXTERNAL (1 << 2) 89 89 #define TTM_TT_FLAG_EXTERNAL_MAPPABLE (1 << 3) 90 90 91 - #define TTM_TT_FLAG_PRIV_POPULATED (1 << 31) 91 + #define TTM_TT_FLAG_PRIV_POPULATED (1U << 31) 92 92 uint32_t page_flags; 93 93 /** @num_pages: Number of pages in the page array. */ 94 94 uint32_t num_pages;
+52
include/soc/bcm2835/raspberrypi-firmware.h
··· 136 136 RPI_FIRMWARE_GET_DMA_CHANNELS = 0x00060001, 137 137 }; 138 138 139 + enum rpi_firmware_clk_id { 140 + RPI_FIRMWARE_EMMC_CLK_ID = 1, 141 + RPI_FIRMWARE_UART_CLK_ID, 142 + RPI_FIRMWARE_ARM_CLK_ID, 143 + RPI_FIRMWARE_CORE_CLK_ID, 144 + RPI_FIRMWARE_V3D_CLK_ID, 145 + RPI_FIRMWARE_H264_CLK_ID, 146 + RPI_FIRMWARE_ISP_CLK_ID, 147 + RPI_FIRMWARE_SDRAM_CLK_ID, 148 + RPI_FIRMWARE_PIXEL_CLK_ID, 149 + RPI_FIRMWARE_PWM_CLK_ID, 150 + RPI_FIRMWARE_HEVC_CLK_ID, 151 + RPI_FIRMWARE_EMMC2_CLK_ID, 152 + RPI_FIRMWARE_M2MC_CLK_ID, 153 + RPI_FIRMWARE_PIXEL_BVB_CLK_ID, 154 + RPI_FIRMWARE_VEC_CLK_ID, 155 + RPI_FIRMWARE_NUM_CLK_ID, 156 + }; 157 + 158 + /** 159 + * struct rpi_firmware_clk_rate_request - Firmware Request for a rate 160 + * @id: ID of the clock being queried 161 + * @rate: Rate in Hertz. Set by the firmware. 162 + * 163 + * Used by @RPI_FIRMWARE_GET_CLOCK_RATE, @RPI_FIRMWARE_GET_CLOCK_MEASURED, 164 + * @RPI_FIRMWARE_GET_MAX_CLOCK_RATE and @RPI_FIRMWARE_GET_MIN_CLOCK_RATE. 165 + */ 166 + struct rpi_firmware_clk_rate_request { 167 + __le32 id; 168 + __le32 rate; 169 + } __packed; 170 + 171 + #define RPI_FIRMWARE_CLK_RATE_REQUEST(_id) \ 172 + { \ 173 + .id = _id, \ 174 + } 175 + 139 176 #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE) 140 177 int rpi_firmware_property(struct rpi_firmware *fw, 141 178 u32 tag, void *data, size_t len); 142 179 int rpi_firmware_property_list(struct rpi_firmware *fw, 143 180 void *data, size_t tag_size); 144 181 void rpi_firmware_put(struct rpi_firmware *fw); 182 + unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw, 183 + unsigned int id); 184 + struct device_node *rpi_firmware_find_node(void); 145 185 struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node); 146 186 struct rpi_firmware *devm_rpi_firmware_get(struct device *dev, 147 187 struct device_node *firmware_node); ··· 199 159 } 200 160 201 161 static inline void rpi_firmware_put(struct rpi_firmware *fw) { } 162 + 163 + static inline unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw, 164 + unsigned int id) 165 + { 166 + return UINT_MAX; 167 + } 168 + 169 + static inline struct device_node *rpi_firmware_find_node(void) 170 + { 171 + return NULL; 172 + } 173 + 202 174 static inline struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node) 203 175 { 204 176 return NULL;