summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/clk/clk_arb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/clk/clk_arb.c')
-rw-r--r--drivers/gpu/nvgpu/clk/clk_arb.c119
1 files changed, 76 insertions, 43 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk_arb.c b/drivers/gpu/nvgpu/clk/clk_arb.c
index 550c77e0..9232c3dc 100644
--- a/drivers/gpu/nvgpu/clk/clk_arb.c
+++ b/drivers/gpu/nvgpu/clk/clk_arb.c
@@ -313,7 +313,7 @@ int nvgpu_clk_arb_init_arbiter(struct gk20a *g)
313 spin_lock_init(&arb->users_lock); 313 spin_lock_init(&arb->users_lock);
314 314
315 err = g->ops.clk_arb.get_arbiter_clk_default(g, 315 err = g->ops.clk_arb.get_arbiter_clk_default(g,
316 NVGPU_GPU_CLK_DOMAIN_MCLK, &default_mhz); 316 CTRL_CLK_DOMAIN_MCLK, &default_mhz);
317 if (err < 0) { 317 if (err < 0) {
318 err = -EINVAL; 318 err = -EINVAL;
319 goto init_fail; 319 goto init_fail;
@@ -322,7 +322,7 @@ int nvgpu_clk_arb_init_arbiter(struct gk20a *g)
322 arb->mclk_default_mhz = default_mhz; 322 arb->mclk_default_mhz = default_mhz;
323 323
324 err = g->ops.clk_arb.get_arbiter_clk_default(g, 324 err = g->ops.clk_arb.get_arbiter_clk_default(g,
325 NVGPU_GPU_CLK_DOMAIN_GPC2CLK, &default_mhz); 325 CTRL_CLK_DOMAIN_GPC2CLK, &default_mhz);
326 if (err < 0) { 326 if (err < 0) {
327 err = -EINVAL; 327 err = -EINVAL;
328 goto init_fail; 328 goto init_fail;
@@ -672,15 +672,14 @@ static int nvgpu_clk_arb_update_vf_table(struct nvgpu_clk_arb *arb)
672 &arb->vf_table_pool[0]; 672 &arb->vf_table_pool[0];
673 673
674 /* Get allowed memory ranges */ 674 /* Get allowed memory ranges */
675 if (nvgpu_clk_arb_get_arbiter_clk_range(g, NVGPU_GPU_CLK_DOMAIN_GPC2CLK, 675 if (g->ops.clk_arb.get_arbiter_clk_range(g, CTRL_CLK_DOMAIN_GPC2CLK,
676 &gpc2clk_min, 676 &gpc2clk_min, &gpc2clk_max) < 0) {
677 &gpc2clk_max) < 0) {
678 gk20a_err(dev_from_gk20a(g), 677 gk20a_err(dev_from_gk20a(g),
679 "failed to fetch GPC2CLK range"); 678 "failed to fetch GPC2CLK range");
680 goto exit_vf_table; 679 goto exit_vf_table;
681 } 680 }
682 if (nvgpu_clk_arb_get_arbiter_clk_range(g, NVGPU_GPU_CLK_DOMAIN_MCLK, 681 if (g->ops.clk_arb.get_arbiter_clk_range(g, CTRL_CLK_DOMAIN_MCLK,
683 &mclk_min, &mclk_max) < 0) { 682 &mclk_min, &mclk_max) < 0) {
684 gk20a_err(dev_from_gk20a(g), 683 gk20a_err(dev_from_gk20a(g),
685 "failed to fetch MCLK range"); 684 "failed to fetch MCLK range");
686 goto exit_vf_table; 685 goto exit_vf_table;
@@ -689,14 +688,14 @@ static int nvgpu_clk_arb_update_vf_table(struct nvgpu_clk_arb *arb)
689 table->gpc2clk_num_points = MAX_F_POINTS; 688 table->gpc2clk_num_points = MAX_F_POINTS;
690 table->mclk_num_points = MAX_F_POINTS; 689 table->mclk_num_points = MAX_F_POINTS;
691 690
692 if (clk_domain_get_f_points(arb->g, NVGPU_GPU_CLK_DOMAIN_GPC2CLK, 691 if (clk_domain_get_f_points(arb->g, CTRL_CLK_DOMAIN_GPC2CLK,
693 &table->gpc2clk_num_points, arb->gpc2clk_f_points)) { 692 &table->gpc2clk_num_points, arb->gpc2clk_f_points)) {
694 gk20a_err(dev_from_gk20a(g), 693 gk20a_err(dev_from_gk20a(g),
695 "failed to fetch GPC2CLK frequency points"); 694 "failed to fetch GPC2CLK frequency points");
696 goto exit_vf_table; 695 goto exit_vf_table;
697 } 696 }
698 697
699 if (clk_domain_get_f_points(arb->g, NVGPU_GPU_CLK_DOMAIN_MCLK, 698 if (clk_domain_get_f_points(arb->g, CTRL_CLK_DOMAIN_MCLK,
700 &table->mclk_num_points, arb->mclk_f_points)) { 699 &table->mclk_num_points, arb->mclk_f_points)) {
701 gk20a_err(dev_from_gk20a(g), 700 gk20a_err(dev_from_gk20a(g),
702 "failed to fetch MCLK frequency points"); 701 "failed to fetch MCLK frequency points");
@@ -1629,17 +1628,15 @@ int nvgpu_clk_arb_set_session_target_mhz(struct nvgpu_clk_session *session,
1629 1628
1630 switch (api_domain) { 1629 switch (api_domain) {
1631 case NVGPU_GPU_CLK_DOMAIN_MCLK: 1630 case NVGPU_GPU_CLK_DOMAIN_MCLK:
1631 case NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS:
1632 dev->mclk_target_mhz = target_mhz; 1632 dev->mclk_target_mhz = target_mhz;
1633 break; 1633 break;
1634 1634
1635 case NVGPU_GPU_CLK_DOMAIN_GPCCLK: 1635 case NVGPU_GPU_CLK_DOMAIN_GPCCLK:
1636 case NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS:
1636 dev->gpc2clk_target_mhz = target_mhz * 2ULL; 1637 dev->gpc2clk_target_mhz = target_mhz * 2ULL;
1637 break; 1638 break;
1638 1639
1639 case NVGPU_GPU_CLK_DOMAIN_GPC2CLK:
1640 dev->gpc2clk_target_mhz = target_mhz;
1641 break;
1642
1643 default: 1640 default:
1644 err = -EINVAL; 1641 err = -EINVAL;
1645 } 1642 }
@@ -1662,17 +1659,15 @@ int nvgpu_clk_arb_get_session_target_mhz(struct nvgpu_clk_session *session,
1662 1659
1663 switch (api_domain) { 1660 switch (api_domain) {
1664 case NVGPU_GPU_CLK_DOMAIN_MCLK: 1661 case NVGPU_GPU_CLK_DOMAIN_MCLK:
1662 case NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS:
1665 *freq_mhz = target->mclk; 1663 *freq_mhz = target->mclk;
1666 break; 1664 break;
1667 1665
1668 case NVGPU_GPU_CLK_DOMAIN_GPCCLK: 1666 case NVGPU_GPU_CLK_DOMAIN_GPCCLK:
1667 case NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS:
1669 *freq_mhz = target->gpc2clk / 2ULL; 1668 *freq_mhz = target->gpc2clk / 2ULL;
1670 break; 1669 break;
1671 1670
1672 case NVGPU_GPU_CLK_DOMAIN_GPC2CLK:
1673 *freq_mhz = target->gpc2clk;
1674 break;
1675
1676 default: 1671 default:
1677 *freq_mhz = 0; 1672 *freq_mhz = 0;
1678 err = -EINVAL; 1673 err = -EINVAL;
@@ -1695,17 +1690,15 @@ int nvgpu_clk_arb_get_arbiter_actual_mhz(struct gk20a *g,
1695 1690
1696 switch (api_domain) { 1691 switch (api_domain) {
1697 case NVGPU_GPU_CLK_DOMAIN_MCLK: 1692 case NVGPU_GPU_CLK_DOMAIN_MCLK:
1693 case NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS:
1698 *freq_mhz = actual->mclk; 1694 *freq_mhz = actual->mclk;
1699 break; 1695 break;
1700 1696
1701 case NVGPU_GPU_CLK_DOMAIN_GPCCLK: 1697 case NVGPU_GPU_CLK_DOMAIN_GPCCLK:
1698 case NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS:
1702 *freq_mhz = actual->gpc2clk / 2ULL; 1699 *freq_mhz = actual->gpc2clk / 2ULL;
1703 break; 1700 break;
1704 1701
1705 case NVGPU_GPU_CLK_DOMAIN_GPC2CLK:
1706 *freq_mhz = actual->gpc2clk;
1707 break;
1708
1709 default: 1702 default:
1710 *freq_mhz = 0; 1703 *freq_mhz = 0;
1711 err = -EINVAL; 1704 err = -EINVAL;
@@ -1717,12 +1710,20 @@ int nvgpu_clk_arb_get_arbiter_actual_mhz(struct gk20a *g,
1717int nvgpu_clk_arb_get_arbiter_effective_mhz(struct gk20a *g, 1710int nvgpu_clk_arb_get_arbiter_effective_mhz(struct gk20a *g,
1718 u32 api_domain, u16 *freq_mhz) 1711 u32 api_domain, u16 *freq_mhz)
1719{ 1712{
1720 if (api_domain == NVGPU_GPU_CLK_DOMAIN_GPCCLK) 1713 switch(api_domain) {
1721 *freq_mhz = g->ops.clk.get_rate(g, 1714 case NVGPU_GPU_CLK_DOMAIN_MCLK:
1722 NVGPU_GPU_CLK_DOMAIN_GPC2CLK) / 2; 1715 case NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS:
1723 else 1716 *freq_mhz = g->ops.clk.get_rate(g, CTRL_CLK_DOMAIN_MCLK);
1724 *freq_mhz = g->ops.clk.get_rate(g, api_domain); 1717 return 0;
1725 return 0; 1718
1719 case NVGPU_GPU_CLK_DOMAIN_GPCCLK:
1720 case NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS:
1721 *freq_mhz = g->ops.clk.get_rate(g, CTRL_CLK_DOMAIN_GPC2CLK) / 2;
1722 return 0;
1723
1724 default:
1725 return -EINVAL;
1726 }
1726} 1727}
1727 1728
1728int nvgpu_clk_arb_get_arbiter_clk_range(struct gk20a *g, u32 api_domain, 1729int nvgpu_clk_arb_get_arbiter_clk_range(struct gk20a *g, u32 api_domain,
@@ -1730,30 +1731,58 @@ int nvgpu_clk_arb_get_arbiter_clk_range(struct gk20a *g, u32 api_domain,
1730{ 1731{
1731 int ret; 1732 int ret;
1732 1733
1733 if (api_domain == NVGPU_GPU_CLK_DOMAIN_GPCCLK) { 1734 switch(api_domain) {
1735 case NVGPU_GPU_CLK_DOMAIN_MCLK:
1736 case NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS:
1737 ret = g->ops.clk_arb.get_arbiter_clk_range(g,
1738 CTRL_CLK_DOMAIN_MCLK, min_mhz, max_mhz);
1739 return ret;
1740
1741 case NVGPU_GPU_CLK_DOMAIN_GPCCLK:
1742 case NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS:
1734 ret = g->ops.clk_arb.get_arbiter_clk_range(g, 1743 ret = g->ops.clk_arb.get_arbiter_clk_range(g,
1735 NVGPU_GPU_CLK_DOMAIN_GPC2CLK, 1744 CTRL_CLK_DOMAIN_GPC2CLK, min_mhz, max_mhz);
1736 min_mhz, max_mhz);
1737 if (!ret) { 1745 if (!ret) {
1738 *min_mhz /= 2; 1746 *min_mhz /= 2;
1739 *max_mhz /= 2; 1747 *max_mhz /= 2;
1740 } 1748 }
1741 } else { 1749 return ret;
1742 ret = g->ops.clk_arb.get_arbiter_clk_range(g, api_domain,
1743 min_mhz, max_mhz);
1744 }
1745 1750
1746 return ret; 1751 default:
1752 return -EINVAL;
1753 }
1747} 1754}
1748 1755
1749u32 nvgpu_clk_arb_get_arbiter_clk_domains(struct gk20a *g) 1756u32 nvgpu_clk_arb_get_arbiter_clk_domains(struct gk20a *g)
1750{ 1757{
1751 u32 clk_domains = g->ops.clk_arb.get_arbiter_clk_domains(g); 1758 u32 clk_domains = g->ops.clk_arb.get_arbiter_clk_domains(g);
1759 u32 api_domains = 0;
1752 1760
1753 if (clk_domains & CTRL_CLK_DOMAIN_GPC2CLK) 1761 if (clk_domains & CTRL_CLK_DOMAIN_GPC2CLK)
1754 clk_domains |= CTRL_CLK_DOMAIN_GPCCLK; 1762 api_domains |= NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS;
1763
1764 if (clk_domains & CTRL_CLK_DOMAIN_MCLK)
1765 api_domains |= NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS;
1755 1766
1756 return clk_domains; 1767 return api_domains;
1768}
1769
1770bool nvgpu_clk_arb_is_valid_domain(struct gk20a *g, u32 api_domain)
1771{
1772 u32 clk_domains = g->ops.clk_arb.get_arbiter_clk_domains(g);
1773
1774 switch(api_domain) {
1775 case NVGPU_GPU_CLK_DOMAIN_MCLK:
1776 case NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS:
1777 return ((clk_domains & CTRL_CLK_DOMAIN_MCLK) != 0);
1778
1779 case NVGPU_GPU_CLK_DOMAIN_GPCCLK:
1780 case NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS:
1781 return ((clk_domains & CTRL_CLK_DOMAIN_GPC2CLK) != 0);
1782
1783 default:
1784 return false;
1785 }
1757} 1786}
1758 1787
1759int nvgpu_clk_arb_get_arbiter_clk_f_points(struct gk20a *g, 1788int nvgpu_clk_arb_get_arbiter_clk_f_points(struct gk20a *g,
@@ -1762,19 +1791,23 @@ int nvgpu_clk_arb_get_arbiter_clk_f_points(struct gk20a *g,
1762 int err; 1791 int err;
1763 u32 i; 1792 u32 i;
1764 1793
1765 if (api_domain == NVGPU_GPU_CLK_DOMAIN_GPCCLK) { 1794 switch (api_domain) {
1766 err = clk_domain_get_f_points(g, NVGPU_GPU_CLK_DOMAIN_GPC2CLK, 1795 case NVGPU_GPU_CLK_DOMAIN_GPCCLK:
1796 case NVGPU_GPU_CLK_DOMAIN_GPCCLK_ALIAS:
1797 err = clk_domain_get_f_points(g, CTRL_CLK_DOMAIN_GPC2CLK,
1767 max_points, fpoints); 1798 max_points, fpoints);
1768 if (err || !fpoints) 1799 if (err || !fpoints)
1769 return err; 1800 return err;
1770 for (i = 0; i < *max_points; i++) 1801 for (i = 0; i < *max_points; i++)
1771 fpoints[i] /= 2; 1802 fpoints[i] /= 2;
1772 } else { 1803 return 0;
1773 err = clk_domain_get_f_points(g, api_domain, 1804 case NVGPU_GPU_CLK_DOMAIN_MCLK:
1805 case NVGPU_GPU_CLK_DOMAIN_MCLK_ALIAS:
1806 return clk_domain_get_f_points(g, CTRL_CLK_DOMAIN_MCLK,
1774 max_points, fpoints); 1807 max_points, fpoints);
1808 default:
1809 return -EINVAL;
1775 } 1810 }
1776
1777 return err;
1778} 1811}
1779 1812
1780static u8 nvgpu_clk_arb_find_vf_point(struct nvgpu_clk_arb *arb, 1813static u8 nvgpu_clk_arb_find_vf_point(struct nvgpu_clk_arb *arb,