2 * Copyright 2018 Red Hat Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
25 #include <nvif/push507c.h>
27 #include <nvhw/class/cl917d.h>
30 head917d_dither(struct nv50_head
*head
, struct nv50_head_atom
*asyh
)
32 struct nvif_push
*push
= nv50_disp(head
->base
.base
.dev
)->core
->chan
.push
;
33 const int i
= head
->base
.index
;
36 if ((ret
= PUSH_WAIT(push
, 2)))
39 PUSH_MTHD(push
, NV917D
, HEAD_SET_DITHER_CONTROL(i
),
40 NVVAL(NV917D
, HEAD_SET_DITHER_CONTROL
, ENABLE
, asyh
->dither
.enable
) |
41 NVVAL(NV917D
, HEAD_SET_DITHER_CONTROL
, BITS
, asyh
->dither
.bits
) |
42 NVVAL(NV917D
, HEAD_SET_DITHER_CONTROL
, MODE
, asyh
->dither
.mode
) |
43 NVVAL(NV917D
, HEAD_SET_DITHER_CONTROL
, PHASE
, 0));
48 head917d_base(struct nv50_head
*head
, struct nv50_head_atom
*asyh
)
50 struct nvif_push
*push
= nv50_disp(head
->base
.base
.dev
)->core
->chan
.push
;
51 const int i
= head
->base
.index
;
56 switch (asyh
->base
.cpp
) {
57 case 8: bounds
|= NVDEF(NV917D
, HEAD_SET_BASE_CHANNEL_USAGE_BOUNDS
, PIXEL_DEPTH
, BPP_64
); break;
58 case 4: bounds
|= NVDEF(NV917D
, HEAD_SET_BASE_CHANNEL_USAGE_BOUNDS
, PIXEL_DEPTH
, BPP_32
); break;
59 case 2: bounds
|= NVDEF(NV917D
, HEAD_SET_BASE_CHANNEL_USAGE_BOUNDS
, PIXEL_DEPTH
, BPP_16
); break;
60 case 1: bounds
|= NVDEF(NV917D
, HEAD_SET_BASE_CHANNEL_USAGE_BOUNDS
, PIXEL_DEPTH
, BPP_8
); break;
65 bounds
|= NVDEF(NV917D
, HEAD_SET_BASE_CHANNEL_USAGE_BOUNDS
, USABLE
, TRUE
);
66 bounds
|= NVDEF(NV917D
, HEAD_SET_BASE_CHANNEL_USAGE_BOUNDS
, BASE_LUT
, USAGE_1025
);
69 if ((ret
= PUSH_WAIT(push
, 2)))
72 PUSH_MTHD(push
, NV917D
, HEAD_SET_BASE_CHANNEL_USAGE_BOUNDS(i
), bounds
);
77 head917d_curs_layout(struct nv50_head
*head
, struct nv50_wndw_atom
*asyw
,
78 struct nv50_head_atom
*asyh
)
80 switch (asyw
->state
.fb
->width
) {
81 case 32: asyh
->curs
.layout
= NV917D_HEAD_SET_CONTROL_CURSOR_SIZE_W32_H32
; break;
82 case 64: asyh
->curs
.layout
= NV917D_HEAD_SET_CONTROL_CURSOR_SIZE_W64_H64
; break;
83 case 128: asyh
->curs
.layout
= NV917D_HEAD_SET_CONTROL_CURSOR_SIZE_W128_H128
; break;
84 case 256: asyh
->curs
.layout
= NV917D_HEAD_SET_CONTROL_CURSOR_SIZE_W256_H256
; break;
91 const struct nv50_head_func
93 .view
= head907d_view
,
94 .mode
= head907d_mode
,
95 .olut
= head907d_olut
,
97 .olut_set
= head907d_olut_set
,
98 .olut_clr
= head907d_olut_clr
,
99 .core_calc
= head507d_core_calc
,
100 .core_set
= head907d_core_set
,
101 .core_clr
= head907d_core_clr
,
102 .curs_layout
= head917d_curs_layout
,
103 .curs_format
= head507d_curs_format
,
104 .curs_set
= head907d_curs_set
,
105 .curs_clr
= head907d_curs_clr
,
106 .base
= head917d_base
,
107 .ovly
= head907d_ovly
,
108 .dither
= head917d_dither
,
109 .procamp
= head907d_procamp
,