hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/drm/nouveau/dispnv50/lut.c
....@@ -29,45 +29,29 @@
2929 #include <nvif/class.h>
3030
3131 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 *))
3434 {
35
- struct drm_color_lut *in = (struct drm_color_lut *)blob->data;
35
+ struct drm_color_lut *in = blob ? blob->data : NULL;
3636 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;
4139
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
+ }
5051 } else {
51
- bits = 14;
52
- shift = 0;
53
- zero = 0x6000;
52
+ load(in, drm_color_lut_size(blob), mem);
5453 }
5554
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);
7155 return addr;
7256 }
7357
....@@ -76,7 +60,7 @@
7660 {
7761 int i;
7862 for (i = 0; i < ARRAY_SIZE(lut->mem); i++)
79
- nvif_mem_fini(&lut->mem[i]);
63
+ nvif_mem_dtor(&lut->mem[i]);
8064 }
8165
8266 int
....@@ -86,8 +70,8 @@
8670 const u32 size = disp->disp->object.oclass < GF110_DISP ? 257 : 1025;
8771 int i;
8872 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]);
9175 if (ret)
9276 return ret;
9377 }