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

drm/nv50-nvc0: precalculate some fb state when creating them

Just a cleanup, to avoid duplicating parts of nv50_crtc.c's code in
the page flipping routines.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>

+61 -55
+47 -5
drivers/gpu/drm/nouveau/nouveau_display.c
··· 32 32 #include "nouveau_hw.h" 33 33 #include "nouveau_crtc.h" 34 34 #include "nouveau_dma.h" 35 + #include "nv50_display.h" 35 36 36 37 static void 37 38 nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb) ··· 62 61 }; 63 62 64 63 int 65 - nouveau_framebuffer_init(struct drm_device *dev, struct nouveau_framebuffer *nouveau_fb, 66 - struct drm_mode_fb_cmd *mode_cmd, struct nouveau_bo *nvbo) 64 + nouveau_framebuffer_init(struct drm_device *dev, 65 + struct nouveau_framebuffer *nv_fb, 66 + struct drm_mode_fb_cmd *mode_cmd, 67 + struct nouveau_bo *nvbo) 67 68 { 69 + struct drm_nouveau_private *dev_priv = dev->dev_private; 70 + struct drm_framebuffer *fb = &nv_fb->base; 68 71 int ret; 69 72 70 - ret = drm_framebuffer_init(dev, &nouveau_fb->base, &nouveau_framebuffer_funcs); 73 + ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs); 71 74 if (ret) { 72 75 return ret; 73 76 } 74 77 75 - drm_helper_mode_fill_fb_struct(&nouveau_fb->base, mode_cmd); 76 - nouveau_fb->nvbo = nvbo; 78 + drm_helper_mode_fill_fb_struct(fb, mode_cmd); 79 + nv_fb->nvbo = nvbo; 80 + 81 + if (dev_priv->card_type >= NV_50) { 82 + u32 tile_flags = nouveau_bo_tile_layout(nvbo); 83 + if (tile_flags == 0x7a00 || 84 + tile_flags == 0xfe00) 85 + nv_fb->r_dma = NvEvoFB32; 86 + else 87 + if (tile_flags == 0x7000) 88 + nv_fb->r_dma = NvEvoFB16; 89 + else 90 + nv_fb->r_dma = NvEvoVRAM_LP; 91 + 92 + switch (fb->depth) { 93 + case 8: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_8; break; 94 + case 15: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_15; break; 95 + case 16: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_16; break; 96 + case 24: 97 + case 32: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_24; break; 98 + case 30: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_30; break; 99 + default: 100 + NV_ERROR(dev, "unknown depth %d\n", fb->depth); 101 + return -EINVAL; 102 + } 103 + 104 + if (dev_priv->chipset == 0x50) 105 + nv_fb->r_format |= (tile_flags << 8); 106 + 107 + if (!tile_flags) 108 + nv_fb->r_pitch = 0x00100000 | fb->pitch; 109 + else { 110 + u32 mode = nvbo->tile_mode; 111 + if (dev_priv->card_type >= NV_C0) 112 + mode >>= 4; 113 + nv_fb->r_pitch = ((fb->pitch / 4) << 4) | mode; 114 + } 115 + } 116 + 77 117 return 0; 78 118 } 79 119
+3
drivers/gpu/drm/nouveau/nouveau_fb.h
··· 30 30 struct nouveau_framebuffer { 31 31 struct drm_framebuffer base; 32 32 struct nouveau_bo *nvbo; 33 + u32 r_dma; 34 + u32 r_format; 35 + u32 r_pitch; 33 36 }; 34 37 35 38 static inline struct nouveau_framebuffer *
+11 -50
drivers/gpu/drm/nouveau/nv50_crtc.c
··· 522 522 struct nouveau_channel *evo = nv50_display(dev)->master; 523 523 struct drm_framebuffer *drm_fb = nv_crtc->base.fb; 524 524 struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); 525 - int ret, format; 525 + int ret; 526 526 527 527 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); 528 528 ··· 548 548 } 549 549 } 550 550 551 - switch (drm_fb->depth) { 552 - case 8: 553 - format = NV50_EVO_CRTC_FB_DEPTH_8; 554 - break; 555 - case 15: 556 - format = NV50_EVO_CRTC_FB_DEPTH_15; 557 - break; 558 - case 16: 559 - format = NV50_EVO_CRTC_FB_DEPTH_16; 560 - break; 561 - case 24: 562 - case 32: 563 - format = NV50_EVO_CRTC_FB_DEPTH_24; 564 - break; 565 - case 30: 566 - format = NV50_EVO_CRTC_FB_DEPTH_30; 567 - break; 568 - default: 569 - NV_ERROR(dev, "unknown depth %d\n", drm_fb->depth); 570 - return -EINVAL; 571 - } 572 - 573 551 nv_crtc->fb.offset = fb->nvbo->bo.mem.start << PAGE_SHIFT; 574 552 nv_crtc->fb.tile_flags = nouveau_bo_tile_layout(fb->nvbo); 575 553 nv_crtc->fb.cpp = drm_fb->bits_per_pixel / 8; ··· 557 579 return ret; 558 580 559 581 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_DMA), 1); 560 - if (nv_crtc->fb.tile_flags == 0x7a00 || 561 - nv_crtc->fb.tile_flags == 0xfe00) 562 - OUT_RING(evo, NvEvoFB32); 563 - else 564 - if (nv_crtc->fb.tile_flags == 0x7000) 565 - OUT_RING(evo, NvEvoFB16); 566 - else 567 - OUT_RING(evo, NvEvoVRAM_LP); 582 + OUT_RING (evo, fb->r_dma); 568 583 } 569 584 570 585 ret = RING_SPACE(evo, 12); ··· 565 594 return ret; 566 595 567 596 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_OFFSET), 5); 568 - OUT_RING(evo, nv_crtc->fb.offset >> 8); 569 - OUT_RING(evo, 0); 570 - OUT_RING(evo, (drm_fb->height << 16) | drm_fb->width); 571 - if (!nv_crtc->fb.tile_flags) { 572 - OUT_RING(evo, drm_fb->pitch | (1 << 20)); 573 - } else { 574 - u32 tile_mode = fb->nvbo->tile_mode; 575 - if (dev_priv->card_type >= NV_C0) 576 - tile_mode >>= 4; 577 - OUT_RING(evo, ((drm_fb->pitch / 4) << 4) | tile_mode); 578 - } 579 - if (dev_priv->chipset == 0x50) 580 - OUT_RING(evo, (nv_crtc->fb.tile_flags << 8) | format); 581 - else 582 - OUT_RING(evo, format); 597 + OUT_RING (evo, nv_crtc->fb.offset >> 8); 598 + OUT_RING (evo, 0); 599 + OUT_RING (evo, (drm_fb->height << 16) | drm_fb->width); 600 + OUT_RING (evo, fb->r_pitch); 601 + OUT_RING (evo, fb->r_format); 583 602 584 603 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, CLUT_MODE), 1); 585 - OUT_RING(evo, fb->base.depth == 8 ? 586 - NV50_EVO_CRTC_CLUT_MODE_OFF : NV50_EVO_CRTC_CLUT_MODE_ON); 604 + OUT_RING (evo, fb->base.depth == 8 ? 605 + NV50_EVO_CRTC_CLUT_MODE_OFF : NV50_EVO_CRTC_CLUT_MODE_ON); 587 606 588 607 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, COLOR_CTRL), 1); 589 - OUT_RING(evo, NV50_EVO_CRTC_COLOR_CTRL_COLOR); 608 + OUT_RING (evo, NV50_EVO_CRTC_COLOR_CTRL_COLOR); 590 609 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_POS), 1); 591 - OUT_RING(evo, (y << 16) | x); 610 + OUT_RING (evo, (y << 16) | x); 592 611 593 612 if (nv_crtc->lut.depth != fb->base.depth) { 594 613 nv_crtc->lut.depth = fb->base.depth;