.. | .. |
---|
29 | 29 | #include <nvif/class.h> |
---|
30 | 30 | |
---|
31 | 31 | u32 |
---|
32 | | -nv50_lut_load(struct nv50_lut *lut, bool legacy, int buffer, |
---|
33 | | - struct drm_property_blob *blob) |
---|
| 32 | +nv50_lut_load(struct nv50_lut *lut, int buffer, struct drm_property_blob *blob, |
---|
| 33 | + void (*load)(struct drm_color_lut *, int, void __iomem *)) |
---|
34 | 34 | { |
---|
35 | | - struct drm_color_lut *in = (struct drm_color_lut *)blob->data; |
---|
| 35 | + struct drm_color_lut *in = blob ? blob->data : NULL; |
---|
36 | 36 | void __iomem *mem = lut->mem[buffer].object.map.ptr; |
---|
37 | | - const int size = blob->length / sizeof(*in); |
---|
38 | | - int bits, shift, i; |
---|
39 | | - u16 zero, r, g, b; |
---|
40 | | - u32 addr = lut->mem[buffer].addr; |
---|
| 37 | + const u32 addr = lut->mem[buffer].addr; |
---|
| 38 | + int i; |
---|
41 | 39 | |
---|
42 | | - /* This can't happen.. But it shuts the compiler up. */ |
---|
43 | | - if (WARN_ON(size != 256)) |
---|
44 | | - return 0; |
---|
45 | | - |
---|
46 | | - if (legacy) { |
---|
47 | | - bits = 11; |
---|
48 | | - shift = 3; |
---|
49 | | - zero = 0x0000; |
---|
| 40 | + if (!in) { |
---|
| 41 | + in = kvmalloc_array(1024, sizeof(*in), GFP_KERNEL); |
---|
| 42 | + if (!WARN_ON(!in)) { |
---|
| 43 | + for (i = 0; i < 1024; i++) { |
---|
| 44 | + in[i].red = |
---|
| 45 | + in[i].green = |
---|
| 46 | + in[i].blue = (i << 16) >> 10; |
---|
| 47 | + } |
---|
| 48 | + load(in, 1024, mem); |
---|
| 49 | + kvfree(in); |
---|
| 50 | + } |
---|
50 | 51 | } else { |
---|
51 | | - bits = 14; |
---|
52 | | - shift = 0; |
---|
53 | | - zero = 0x6000; |
---|
| 52 | + load(in, drm_color_lut_size(blob), mem); |
---|
54 | 53 | } |
---|
55 | 54 | |
---|
56 | | - for (i = 0; i < size; i++) { |
---|
57 | | - r = (drm_color_lut_extract(in[i]. red, bits) + zero) << shift; |
---|
58 | | - g = (drm_color_lut_extract(in[i].green, bits) + zero) << shift; |
---|
59 | | - b = (drm_color_lut_extract(in[i]. blue, bits) + zero) << shift; |
---|
60 | | - writew(r, mem + (i * 0x08) + 0); |
---|
61 | | - writew(g, mem + (i * 0x08) + 2); |
---|
62 | | - writew(b, mem + (i * 0x08) + 4); |
---|
63 | | - } |
---|
64 | | - |
---|
65 | | - /* INTERPOLATE modes require a "next" entry to interpolate with, |
---|
66 | | - * so we replicate the last entry to deal with this for now. |
---|
67 | | - */ |
---|
68 | | - writew(r, mem + (i * 0x08) + 0); |
---|
69 | | - writew(g, mem + (i * 0x08) + 2); |
---|
70 | | - writew(b, mem + (i * 0x08) + 4); |
---|
71 | 55 | return addr; |
---|
72 | 56 | } |
---|
73 | 57 | |
---|
.. | .. |
---|
76 | 60 | { |
---|
77 | 61 | int i; |
---|
78 | 62 | for (i = 0; i < ARRAY_SIZE(lut->mem); i++) |
---|
79 | | - nvif_mem_fini(&lut->mem[i]); |
---|
| 63 | + nvif_mem_dtor(&lut->mem[i]); |
---|
80 | 64 | } |
---|
81 | 65 | |
---|
82 | 66 | int |
---|
.. | .. |
---|
86 | 70 | const u32 size = disp->disp->object.oclass < GF110_DISP ? 257 : 1025; |
---|
87 | 71 | int i; |
---|
88 | 72 | for (i = 0; i < ARRAY_SIZE(lut->mem); i++) { |
---|
89 | | - int ret = nvif_mem_init_map(mmu, NVIF_MEM_VRAM, size * 8, |
---|
90 | | - &lut->mem[i]); |
---|
| 73 | + int ret = nvif_mem_ctor_map(mmu, "kmsLut", NVIF_MEM_VRAM, |
---|
| 74 | + size * 8, &lut->mem[i]); |
---|
91 | 75 | if (ret) |
---|
92 | 76 | return ret; |
---|
93 | 77 | } |
---|