| /* 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 |