diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_hw.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_hw.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.c b/drivers/gpu/drm/nouveau/nouveau_hw.c index 7b613682e400..bed669a54a2d 100644 --- a/drivers/gpu/drm/nouveau/nouveau_hw.c +++ b/drivers/gpu/drm/nouveau/nouveau_hw.c | |||
@@ -305,7 +305,7 @@ setPLL_double_lowregs(struct drm_device *dev, uint32_t NMNMreg, | |||
305 | bool mpll = Preg == 0x4020; | 305 | bool mpll = Preg == 0x4020; |
306 | uint32_t oldPval = nvReadMC(dev, Preg); | 306 | uint32_t oldPval = nvReadMC(dev, Preg); |
307 | uint32_t NMNM = pv->NM2 << 16 | pv->NM1; | 307 | uint32_t NMNM = pv->NM2 << 16 | pv->NM1; |
308 | uint32_t Pval = (oldPval & (mpll ? ~(0x11 << 16) : ~(1 << 16))) | | 308 | uint32_t Pval = (oldPval & (mpll ? ~(0x77 << 16) : ~(7 << 16))) | |
309 | 0xc << 28 | pv->log2P << 16; | 309 | 0xc << 28 | pv->log2P << 16; |
310 | uint32_t saved4600 = 0; | 310 | uint32_t saved4600 = 0; |
311 | /* some cards have different maskc040s */ | 311 | /* some cards have different maskc040s */ |
@@ -427,22 +427,12 @@ nouveau_hw_get_pllvals(struct drm_device *dev, enum pll_types plltype, | |||
427 | struct nouveau_pll_vals *pllvals) | 427 | struct nouveau_pll_vals *pllvals) |
428 | { | 428 | { |
429 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 429 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
430 | const uint32_t nv04_regs[MAX_PLL_TYPES] = { NV_PRAMDAC_NVPLL_COEFF, | 430 | uint32_t reg1 = get_pll_register(dev, plltype), pll1, pll2 = 0; |
431 | NV_PRAMDAC_MPLL_COEFF, | ||
432 | NV_PRAMDAC_VPLL_COEFF, | ||
433 | NV_RAMDAC_VPLL2 }; | ||
434 | const uint32_t nv40_regs[MAX_PLL_TYPES] = { 0x4000, | ||
435 | 0x4020, | ||
436 | NV_PRAMDAC_VPLL_COEFF, | ||
437 | NV_RAMDAC_VPLL2 }; | ||
438 | uint32_t reg1, pll1, pll2 = 0; | ||
439 | struct pll_lims pll_lim; | 431 | struct pll_lims pll_lim; |
440 | int ret; | 432 | int ret; |
441 | 433 | ||
442 | if (dev_priv->card_type < NV_40) | 434 | if (reg1 == 0) |
443 | reg1 = nv04_regs[plltype]; | 435 | return -ENOENT; |
444 | else | ||
445 | reg1 = nv40_regs[plltype]; | ||
446 | 436 | ||
447 | pll1 = nvReadMC(dev, reg1); | 437 | pll1 = nvReadMC(dev, reg1); |
448 | 438 | ||
@@ -491,8 +481,10 @@ int | |||
491 | nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype) | 481 | nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype) |
492 | { | 482 | { |
493 | struct nouveau_pll_vals pllvals; | 483 | struct nouveau_pll_vals pllvals; |
484 | int ret; | ||
494 | 485 | ||
495 | if (plltype == MPLL && (dev->pci_device & 0x0ff0) == CHIPSET_NFORCE) { | 486 | if (plltype == PLL_MEMORY && |
487 | (dev->pci_device & 0x0ff0) == CHIPSET_NFORCE) { | ||
496 | uint32_t mpllP; | 488 | uint32_t mpllP; |
497 | 489 | ||
498 | pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP); | 490 | pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP); |
@@ -501,14 +493,17 @@ nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype) | |||
501 | 493 | ||
502 | return 400000 / mpllP; | 494 | return 400000 / mpllP; |
503 | } else | 495 | } else |
504 | if (plltype == MPLL && (dev->pci_device & 0xff0) == CHIPSET_NFORCE2) { | 496 | if (plltype == PLL_MEMORY && |
497 | (dev->pci_device & 0xff0) == CHIPSET_NFORCE2) { | ||
505 | uint32_t clock; | 498 | uint32_t clock; |
506 | 499 | ||
507 | pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock); | 500 | pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock); |
508 | return clock; | 501 | return clock; |
509 | } | 502 | } |
510 | 503 | ||
511 | nouveau_hw_get_pllvals(dev, plltype, &pllvals); | 504 | ret = nouveau_hw_get_pllvals(dev, plltype, &pllvals); |
505 | if (ret) | ||
506 | return ret; | ||
512 | 507 | ||
513 | return nouveau_hw_pllvals_to_clk(&pllvals); | 508 | return nouveau_hw_pllvals_to_clk(&pllvals); |
514 | } | 509 | } |
@@ -526,9 +521,9 @@ nouveau_hw_fix_bad_vpll(struct drm_device *dev, int head) | |||
526 | struct nouveau_pll_vals pv; | 521 | struct nouveau_pll_vals pv; |
527 | uint32_t pllreg = head ? NV_RAMDAC_VPLL2 : NV_PRAMDAC_VPLL_COEFF; | 522 | uint32_t pllreg = head ? NV_RAMDAC_VPLL2 : NV_PRAMDAC_VPLL_COEFF; |
528 | 523 | ||
529 | if (get_pll_limits(dev, head ? VPLL2 : VPLL1, &pll_lim)) | 524 | if (get_pll_limits(dev, pllreg, &pll_lim)) |
530 | return; | 525 | return; |
531 | nouveau_hw_get_pllvals(dev, head ? VPLL2 : VPLL1, &pv); | 526 | nouveau_hw_get_pllvals(dev, pllreg, &pv); |
532 | 527 | ||
533 | if (pv.M1 >= pll_lim.vco1.min_m && pv.M1 <= pll_lim.vco1.max_m && | 528 | if (pv.M1 >= pll_lim.vco1.min_m && pv.M1 <= pll_lim.vco1.max_m && |
534 | pv.N1 >= pll_lim.vco1.min_n && pv.N1 <= pll_lim.vco1.max_n && | 529 | pv.N1 >= pll_lim.vco1.min_n && pv.N1 <= pll_lim.vco1.max_n && |
@@ -661,7 +656,7 @@ nv_save_state_ramdac(struct drm_device *dev, int head, | |||
661 | if (dev_priv->card_type >= NV_10) | 656 | if (dev_priv->card_type >= NV_10) |
662 | regp->nv10_cursync = NVReadRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC); | 657 | regp->nv10_cursync = NVReadRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC); |
663 | 658 | ||
664 | nouveau_hw_get_pllvals(dev, head ? VPLL2 : VPLL1, ®p->pllvals); | 659 | nouveau_hw_get_pllvals(dev, head ? PLL_VPLL1 : PLL_VPLL0, ®p->pllvals); |
665 | state->pllsel = NVReadRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT); | 660 | state->pllsel = NVReadRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT); |
666 | if (nv_two_heads(dev)) | 661 | if (nv_two_heads(dev)) |
667 | state->sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK); | 662 | state->sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK); |
@@ -866,10 +861,11 @@ nv_save_state_ext(struct drm_device *dev, int head, | |||
866 | rd_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); | 861 | rd_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); |
867 | rd_cio_state(dev, head, regp, NV_CIO_CRE_21); | 862 | rd_cio_state(dev, head, regp, NV_CIO_CRE_21); |
868 | 863 | ||
869 | if (dev_priv->card_type >= NV_30) { | 864 | if (dev_priv->card_type >= NV_20) |
870 | rd_cio_state(dev, head, regp, NV_CIO_CRE_47); | 865 | rd_cio_state(dev, head, regp, NV_CIO_CRE_47); |
866 | |||
867 | if (dev_priv->card_type >= NV_30) | ||
871 | rd_cio_state(dev, head, regp, 0x9f); | 868 | rd_cio_state(dev, head, regp, 0x9f); |
872 | } | ||
873 | 869 | ||
874 | rd_cio_state(dev, head, regp, NV_CIO_CRE_49); | 870 | rd_cio_state(dev, head, regp, NV_CIO_CRE_49); |
875 | rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); | 871 | rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); |
@@ -976,10 +972,11 @@ nv_load_state_ext(struct drm_device *dev, int head, | |||
976 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX); | 972 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX); |
977 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); | 973 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); |
978 | 974 | ||
979 | if (dev_priv->card_type >= NV_30) { | 975 | if (dev_priv->card_type >= NV_20) |
980 | wr_cio_state(dev, head, regp, NV_CIO_CRE_47); | 976 | wr_cio_state(dev, head, regp, NV_CIO_CRE_47); |
977 | |||
978 | if (dev_priv->card_type >= NV_30) | ||
981 | wr_cio_state(dev, head, regp, 0x9f); | 979 | wr_cio_state(dev, head, regp, 0x9f); |
982 | } | ||
983 | 980 | ||
984 | wr_cio_state(dev, head, regp, NV_CIO_CRE_49); | 981 | wr_cio_state(dev, head, regp, NV_CIO_CRE_49); |
985 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); | 982 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); |