hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __NVBIOS_PLL_H__
#define __NVBIOS_PLL_H__
/*XXX: kill me */
struct nvkm_pll_vals {
   union {
       struct {
#ifdef __BIG_ENDIAN
           uint8_t N1, M1, N2, M2;
#else
           uint8_t M1, N1, M2, N2;
#endif
       };
       struct {
           uint16_t NM1, NM2;
       } __attribute__((packed));
   };
   int log2P;
 
   int refclk;
};
 
/* these match types in pll limits table version 0x40,
 * nvkm uses them on all chipsets internally where a
 * specific pll needs to be referenced, but the exact
 * register isn't known.
 */
enum nvbios_pll_type {
   PLL_CORE   = 0x01,
   PLL_SHADER = 0x02,
   PLL_UNK03  = 0x03,
   PLL_MEMORY = 0x04,
   PLL_VDEC   = 0x05,
   PLL_UNK40  = 0x40,
   PLL_UNK41  = 0x41,
   PLL_UNK42  = 0x42,
   PLL_VPLL0  = 0x80,
   PLL_VPLL1  = 0x81,
   PLL_VPLL2  = 0x82,
   PLL_VPLL3  = 0x83,
   PLL_MAX    = 0xff
};
 
struct nvbios_pll {
   enum nvbios_pll_type type;
   u32 reg;
   u32 refclk;
 
   u8 min_p;
   u8 max_p;
   u8 bias_p;
 
   /*
    * for most pre nv50 cards setting a log2P of 7 (the common max_log2p
    * value) is no different to 6 (at least for vplls) so allowing the MNP
    * calc to use 7 causes the generated clock to be out by a factor of 2.
    * however, max_log2p cannot be fixed-up during parsing as the
    * unmodified max_log2p value is still needed for setting mplls, hence
    * an additional max_usable_log2p member
    */
   u8 max_p_usable;
 
   struct {
       u32 min_freq;
       u32 max_freq;
       u32 min_inputfreq;
       u32 max_inputfreq;
       u8  min_m;
       u8  max_m;
       u8  min_n;
       u8  max_n;
   } vco1, vco2;
};
 
int nvbios_pll_parse(struct nvkm_bios *, u32 type, struct nvbios_pll *);
#endif