aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-03-30 07:56:26 -0400
committerBen Skeggs <bskeggs@redhat.com>2013-04-26 01:37:47 -0400
commit3f196a045e2f7e0b7c5302d359a9772c1567d55b (patch)
treedbbecb145408cacad12c2e8bbeb5f8d096cd5792
parent8cb303a85b5782c337fe75d2525ca1638b30f057 (diff)
drm/nve0: magic up some support for GF117
Seen in the wild, don't have the hardware but this hacks things up to treat it the same as GF119 for now. Should be relatively safe, I'd be very surprised if anything major changed outside of PGRAPH. PGRAPH (3D etc) is disabled by default however until it's confirmed working. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c48
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/fuc/gpcnvc0.fuc5
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnvc0.fuc3
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c3
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/nvc0.h1
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c28
6 files changed, 63 insertions, 25 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
index 0b7951a85943..ebc9caa951f6 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
@@ -1399,7 +1399,7 @@ nvc0_grctx_generate_90c0(struct nvc0_graph_priv *priv)
1399{ 1399{
1400 int i; 1400 int i;
1401 1401
1402 for (i = 0; nv_device(priv)->chipset == 0xd9 && i < 4; i++) { 1402 for (i = 0; nv_device(priv)->chipset >= 0xd0 && i < 4; i++) {
1403 nv_mthd(priv, 0x90c0, 0x2700 + (i * 0x40), 0x00000000); 1403 nv_mthd(priv, 0x90c0, 0x2700 + (i * 0x40), 0x00000000);
1404 nv_mthd(priv, 0x90c0, 0x2720 + (i * 0x40), 0x00000000); 1404 nv_mthd(priv, 0x90c0, 0x2720 + (i * 0x40), 0x00000000);
1405 nv_mthd(priv, 0x90c0, 0x2704 + (i * 0x40), 0x00000000); 1405 nv_mthd(priv, 0x90c0, 0x2704 + (i * 0x40), 0x00000000);
@@ -1415,7 +1415,7 @@ nvc0_grctx_generate_90c0(struct nvc0_graph_priv *priv)
1415 nv_mthd(priv, 0x90c0, 0x27ac, 0x00000000); 1415 nv_mthd(priv, 0x90c0, 0x27ac, 0x00000000);
1416 nv_mthd(priv, 0x90c0, 0x27cc, 0x00000000); 1416 nv_mthd(priv, 0x90c0, 0x27cc, 0x00000000);
1417 nv_mthd(priv, 0x90c0, 0x27ec, 0x00000000); 1417 nv_mthd(priv, 0x90c0, 0x27ec, 0x00000000);
1418 for (i = 0; nv_device(priv)->chipset == 0xd9 && i < 4; i++) { 1418 for (i = 0; nv_device(priv)->chipset >= 0xd0 && i < 4; i++) {
1419 nv_mthd(priv, 0x90c0, 0x2710 + (i * 0x40), 0x00014000); 1419 nv_mthd(priv, 0x90c0, 0x2710 + (i * 0x40), 0x00014000);
1420 nv_mthd(priv, 0x90c0, 0x2730 + (i * 0x40), 0x00014000); 1420 nv_mthd(priv, 0x90c0, 0x2730 + (i * 0x40), 0x00014000);
1421 nv_mthd(priv, 0x90c0, 0x2714 + (i * 0x40), 0x00000040); 1421 nv_mthd(priv, 0x90c0, 0x2714 + (i * 0x40), 0x00000040);
@@ -1615,7 +1615,7 @@ static void
1615nvc0_grctx_generate_shaders(struct nvc0_graph_priv *priv) 1615nvc0_grctx_generate_shaders(struct nvc0_graph_priv *priv)
1616{ 1616{
1617 1617
1618 if (nv_device(priv)->chipset == 0xd9) { 1618 if (nv_device(priv)->chipset >= 0xd0) {
1619 nv_wr32(priv, 0x405800, 0x0f8000bf); 1619 nv_wr32(priv, 0x405800, 0x0f8000bf);
1620 nv_wr32(priv, 0x405830, 0x02180218); 1620 nv_wr32(priv, 0x405830, 0x02180218);
1621 nv_wr32(priv, 0x405834, 0x08000000); 1621 nv_wr32(priv, 0x405834, 0x08000000);
@@ -1658,10 +1658,10 @@ nvc0_grctx_generate_unk64xx(struct nvc0_graph_priv *priv)
1658 nv_wr32(priv, 0x4064ac, 0x00003fff); 1658 nv_wr32(priv, 0x4064ac, 0x00003fff);
1659 nv_wr32(priv, 0x4064b4, 0x00000000); 1659 nv_wr32(priv, 0x4064b4, 0x00000000);
1660 nv_wr32(priv, 0x4064b8, 0x00000000); 1660 nv_wr32(priv, 0x4064b8, 0x00000000);
1661 if (nv_device(priv)->chipset == 0xd9) 1661 if (nv_device(priv)->chipset >= 0xd0)
1662 nv_wr32(priv, 0x4064bc, 0x00000000); 1662 nv_wr32(priv, 0x4064bc, 0x00000000);
1663 if (nv_device(priv)->chipset == 0xc1 || 1663 if (nv_device(priv)->chipset == 0xc1 ||
1664 nv_device(priv)->chipset == 0xd9) { 1664 nv_device(priv)->chipset >= 0xd0) {
1665 nv_wr32(priv, 0x4064c0, 0x80140078); 1665 nv_wr32(priv, 0x4064c0, 0x80140078);
1666 nv_wr32(priv, 0x4064c4, 0x0086ffff); 1666 nv_wr32(priv, 0x4064c4, 0x0086ffff);
1667 } 1667 }
@@ -1701,7 +1701,7 @@ nvc0_grctx_generate_rop(struct nvc0_graph_priv *priv)
1701 /* ROPC_BROADCAST */ 1701 /* ROPC_BROADCAST */
1702 nv_wr32(priv, 0x408800, 0x02802a3c); 1702 nv_wr32(priv, 0x408800, 0x02802a3c);
1703 nv_wr32(priv, 0x408804, 0x00000040); 1703 nv_wr32(priv, 0x408804, 0x00000040);
1704 if (chipset == 0xd9) { 1704 if (chipset >= 0xd0) {
1705 nv_wr32(priv, 0x408808, 0x1043e005); 1705 nv_wr32(priv, 0x408808, 0x1043e005);
1706 nv_wr32(priv, 0x408900, 0x3080b801); 1706 nv_wr32(priv, 0x408900, 0x3080b801);
1707 nv_wr32(priv, 0x408904, 0x1043e005); 1707 nv_wr32(priv, 0x408904, 0x1043e005);
@@ -1735,7 +1735,7 @@ nvc0_grctx_generate_gpc(struct nvc0_graph_priv *priv)
1735 nv_wr32(priv, 0x418408, 0x00000000); 1735 nv_wr32(priv, 0x418408, 0x00000000);
1736 nv_wr32(priv, 0x41840c, 0x00001008); 1736 nv_wr32(priv, 0x41840c, 0x00001008);
1737 nv_wr32(priv, 0x418410, 0x0fff0fff); 1737 nv_wr32(priv, 0x418410, 0x0fff0fff);
1738 nv_wr32(priv, 0x418414, chipset != 0xd9 ? 0x00200fff : 0x02200fff); 1738 nv_wr32(priv, 0x418414, chipset < 0xd0 ? 0x00200fff : 0x02200fff);
1739 nv_wr32(priv, 0x418450, 0x00000000); 1739 nv_wr32(priv, 0x418450, 0x00000000);
1740 nv_wr32(priv, 0x418454, 0x00000000); 1740 nv_wr32(priv, 0x418454, 0x00000000);
1741 nv_wr32(priv, 0x418458, 0x00000000); 1741 nv_wr32(priv, 0x418458, 0x00000000);
@@ -1750,14 +1750,14 @@ nvc0_grctx_generate_gpc(struct nvc0_graph_priv *priv)
1750 nv_wr32(priv, 0x418700, 0x00000002); 1750 nv_wr32(priv, 0x418700, 0x00000002);
1751 nv_wr32(priv, 0x418704, 0x00000080); 1751 nv_wr32(priv, 0x418704, 0x00000080);
1752 nv_wr32(priv, 0x418708, 0x00000000); 1752 nv_wr32(priv, 0x418708, 0x00000000);
1753 nv_wr32(priv, 0x41870c, chipset != 0xd9 ? 0x07c80000 : 0x00000000); 1753 nv_wr32(priv, 0x41870c, chipset < 0xd0 ? 0x07c80000 : 0x00000000);
1754 nv_wr32(priv, 0x418710, 0x00000000); 1754 nv_wr32(priv, 0x418710, 0x00000000);
1755 nv_wr32(priv, 0x418800, chipset != 0xd9 ? 0x0006860a : 0x7006860a); 1755 nv_wr32(priv, 0x418800, chipset < 0xd0 ? 0x0006860a : 0x7006860a);
1756 nv_wr32(priv, 0x418808, 0x00000000); 1756 nv_wr32(priv, 0x418808, 0x00000000);
1757 nv_wr32(priv, 0x41880c, 0x00000000); 1757 nv_wr32(priv, 0x41880c, 0x00000000);
1758 nv_wr32(priv, 0x418810, 0x00000000); 1758 nv_wr32(priv, 0x418810, 0x00000000);
1759 nv_wr32(priv, 0x418828, 0x00008442); 1759 nv_wr32(priv, 0x418828, 0x00008442);
1760 if (chipset == 0xc1 || chipset == 0xd9) 1760 if (chipset == 0xc1 || chipset >= 0xd0)
1761 nv_wr32(priv, 0x418830, 0x10000001); 1761 nv_wr32(priv, 0x418830, 0x10000001);
1762 else 1762 else
1763 nv_wr32(priv, 0x418830, 0x00000001); 1763 nv_wr32(priv, 0x418830, 0x00000001);
@@ -1768,7 +1768,7 @@ nvc0_grctx_generate_gpc(struct nvc0_graph_priv *priv)
1768 nv_wr32(priv, 0x4188f0, 0x00000000); 1768 nv_wr32(priv, 0x4188f0, 0x00000000);
1769 nv_wr32(priv, 0x4188f4, 0x00000000); 1769 nv_wr32(priv, 0x4188f4, 0x00000000);
1770 nv_wr32(priv, 0x4188f8, 0x00000000); 1770 nv_wr32(priv, 0x4188f8, 0x00000000);
1771 if (chipset == 0xd9) 1771 if (chipset >= 0xd0)
1772 nv_wr32(priv, 0x4188fc, 0x20100008); 1772 nv_wr32(priv, 0x4188fc, 0x20100008);
1773 else if (chipset == 0xc1) 1773 else if (chipset == 0xc1)
1774 nv_wr32(priv, 0x4188fc, 0x00100018); 1774 nv_wr32(priv, 0x4188fc, 0x00100018);
@@ -1787,7 +1787,7 @@ nvc0_grctx_generate_gpc(struct nvc0_graph_priv *priv)
1787 nv_wr32(priv, 0x418a14 + (i * 0x20), 0x00000000); 1787 nv_wr32(priv, 0x418a14 + (i * 0x20), 0x00000000);
1788 nv_wr32(priv, 0x418a18 + (i * 0x20), 0x00000000); 1788 nv_wr32(priv, 0x418a18 + (i * 0x20), 0x00000000);
1789 } 1789 }
1790 nv_wr32(priv, 0x418b00, chipset != 0xd9 ? 0x00000000 : 0x00000006); 1790 nv_wr32(priv, 0x418b00, chipset < 0xd0 ? 0x00000000 : 0x00000006);
1791 nv_wr32(priv, 0x418b08, 0x0a418820); 1791 nv_wr32(priv, 0x418b08, 0x0a418820);
1792 nv_wr32(priv, 0x418b0c, 0x062080e6); 1792 nv_wr32(priv, 0x418b0c, 0x062080e6);
1793 nv_wr32(priv, 0x418b10, 0x020398a4); 1793 nv_wr32(priv, 0x418b10, 0x020398a4);
@@ -1804,7 +1804,7 @@ nvc0_grctx_generate_gpc(struct nvc0_graph_priv *priv)
1804 nv_wr32(priv, 0x418c24, 0x00000000); 1804 nv_wr32(priv, 0x418c24, 0x00000000);
1805 nv_wr32(priv, 0x418c28, 0x00000000); 1805 nv_wr32(priv, 0x418c28, 0x00000000);
1806 nv_wr32(priv, 0x418c2c, 0x00000000); 1806 nv_wr32(priv, 0x418c2c, 0x00000000);
1807 if (chipset == 0xc1 || chipset == 0xd9) 1807 if (chipset == 0xc1 || chipset >= 0xd0)
1808 nv_wr32(priv, 0x418c6c, 0x00000001); 1808 nv_wr32(priv, 0x418c6c, 0x00000001);
1809 nv_wr32(priv, 0x418c80, 0x20200004); 1809 nv_wr32(priv, 0x418c80, 0x20200004);
1810 nv_wr32(priv, 0x418c8c, 0x00000001); 1810 nv_wr32(priv, 0x418c8c, 0x00000001);
@@ -1823,7 +1823,7 @@ nvc0_grctx_generate_tp(struct nvc0_graph_priv *priv)
1823 nv_wr32(priv, 0x419818, 0x00000000); 1823 nv_wr32(priv, 0x419818, 0x00000000);
1824 nv_wr32(priv, 0x41983c, 0x00038bc7); 1824 nv_wr32(priv, 0x41983c, 0x00038bc7);
1825 nv_wr32(priv, 0x419848, 0x00000000); 1825 nv_wr32(priv, 0x419848, 0x00000000);
1826 if (chipset == 0xc1 || chipset == 0xd9) 1826 if (chipset == 0xc1 || chipset >= 0xd0)
1827 nv_wr32(priv, 0x419864, 0x00000129); 1827 nv_wr32(priv, 0x419864, 0x00000129);
1828 else 1828 else
1829 nv_wr32(priv, 0x419864, 0x0000012a); 1829 nv_wr32(priv, 0x419864, 0x0000012a);
@@ -1836,7 +1836,7 @@ nvc0_grctx_generate_tp(struct nvc0_graph_priv *priv)
1836 nv_wr32(priv, 0x419a14, 0x00000200); 1836 nv_wr32(priv, 0x419a14, 0x00000200);
1837 nv_wr32(priv, 0x419a1c, 0x00000000); 1837 nv_wr32(priv, 0x419a1c, 0x00000000);
1838 nv_wr32(priv, 0x419a20, 0x00000800); 1838 nv_wr32(priv, 0x419a20, 0x00000800);
1839 if (chipset == 0xd9) 1839 if (chipset >= 0xd0)
1840 nv_wr32(priv, 0x00419ac4, 0x0017f440); 1840 nv_wr32(priv, 0x00419ac4, 0x0017f440);
1841 else if (chipset != 0xc0 && chipset != 0xc8) 1841 else if (chipset != 0xc0 && chipset != 0xc8)
1842 nv_wr32(priv, 0x00419ac4, 0x0007f440); 1842 nv_wr32(priv, 0x00419ac4, 0x0007f440);
@@ -1847,16 +1847,16 @@ nvc0_grctx_generate_tp(struct nvc0_graph_priv *priv)
1847 nv_wr32(priv, 0x419b10, 0x0a418820); 1847 nv_wr32(priv, 0x419b10, 0x0a418820);
1848 nv_wr32(priv, 0x419b14, 0x000000e6); 1848 nv_wr32(priv, 0x419b14, 0x000000e6);
1849 nv_wr32(priv, 0x419bd0, 0x00900103); 1849 nv_wr32(priv, 0x419bd0, 0x00900103);
1850 if (chipset == 0xc1 || chipset == 0xd9) 1850 if (chipset == 0xc1 || chipset >= 0xd0)
1851 nv_wr32(priv, 0x419be0, 0x00400001); 1851 nv_wr32(priv, 0x419be0, 0x00400001);
1852 else 1852 else
1853 nv_wr32(priv, 0x419be0, 0x00000001); 1853 nv_wr32(priv, 0x419be0, 0x00000001);
1854 nv_wr32(priv, 0x419be4, 0x00000000); 1854 nv_wr32(priv, 0x419be4, 0x00000000);
1855 nv_wr32(priv, 0x419c00, chipset != 0xd9 ? 0x00000002 : 0x0000000a); 1855 nv_wr32(priv, 0x419c00, chipset < 0xd0 ? 0x00000002 : 0x0000000a);
1856 nv_wr32(priv, 0x419c04, 0x00000006); 1856 nv_wr32(priv, 0x419c04, 0x00000006);
1857 nv_wr32(priv, 0x419c08, 0x00000002); 1857 nv_wr32(priv, 0x419c08, 0x00000002);
1858 nv_wr32(priv, 0x419c20, 0x00000000); 1858 nv_wr32(priv, 0x419c20, 0x00000000);
1859 if (nv_device(priv)->chipset == 0xd9) { 1859 if (nv_device(priv)->chipset >= 0xd0) {
1860 nv_wr32(priv, 0x419c24, 0x00084210); 1860 nv_wr32(priv, 0x419c24, 0x00084210);
1861 nv_wr32(priv, 0x419c28, 0x3cf3cf3c); 1861 nv_wr32(priv, 0x419c28, 0x3cf3cf3c);
1862 nv_wr32(priv, 0x419cb0, 0x00020048); 1862 nv_wr32(priv, 0x419cb0, 0x00020048);
@@ -1868,12 +1868,12 @@ nvc0_grctx_generate_tp(struct nvc0_graph_priv *priv)
1868 } 1868 }
1869 nv_wr32(priv, 0x419ce8, 0x00000000); 1869 nv_wr32(priv, 0x419ce8, 0x00000000);
1870 nv_wr32(priv, 0x419cf4, 0x00000183); 1870 nv_wr32(priv, 0x419cf4, 0x00000183);
1871 if (chipset == 0xc1 || chipset == 0xd9) 1871 if (chipset == 0xc1 || chipset >= 0xd0)
1872 nv_wr32(priv, 0x419d20, 0x12180000); 1872 nv_wr32(priv, 0x419d20, 0x12180000);
1873 else 1873 else
1874 nv_wr32(priv, 0x419d20, 0x02180000); 1874 nv_wr32(priv, 0x419d20, 0x02180000);
1875 nv_wr32(priv, 0x419d24, 0x00001fff); 1875 nv_wr32(priv, 0x419d24, 0x00001fff);
1876 if (chipset == 0xc1 || chipset == 0xd9) 1876 if (chipset == 0xc1 || chipset >= 0xd0)
1877 nv_wr32(priv, 0x419d44, 0x02180218); 1877 nv_wr32(priv, 0x419d44, 0x02180218);
1878 nv_wr32(priv, 0x419e04, 0x00000000); 1878 nv_wr32(priv, 0x419e04, 0x00000000);
1879 nv_wr32(priv, 0x419e08, 0x00000000); 1879 nv_wr32(priv, 0x419e08, 0x00000000);
@@ -2210,7 +2210,7 @@ nvc0_grctx_generate(struct nvc0_graph_priv *priv)
2210 nv_icmd(priv, 0x00000215, 0x00000040); 2210 nv_icmd(priv, 0x00000215, 0x00000040);
2211 nv_icmd(priv, 0x00000216, 0x00000040); 2211 nv_icmd(priv, 0x00000216, 0x00000040);
2212 nv_icmd(priv, 0x00000217, 0x00000040); 2212 nv_icmd(priv, 0x00000217, 0x00000040);
2213 if (nv_device(priv)->chipset == 0xd9) { 2213 if (nv_device(priv)->chipset >= 0xd0) {
2214 for (i = 0x0400; i <= 0x0417; i++) 2214 for (i = 0x0400; i <= 0x0417; i++)
2215 nv_icmd(priv, i, 0x00000040); 2215 nv_icmd(priv, i, 0x00000040);
2216 } 2216 }
@@ -2222,7 +2222,7 @@ nvc0_grctx_generate(struct nvc0_graph_priv *priv)
2222 nv_icmd(priv, 0x0000021d, 0x0000c080); 2222 nv_icmd(priv, 0x0000021d, 0x0000c080);
2223 nv_icmd(priv, 0x0000021e, 0x0000c080); 2223 nv_icmd(priv, 0x0000021e, 0x0000c080);
2224 nv_icmd(priv, 0x0000021f, 0x0000c080); 2224 nv_icmd(priv, 0x0000021f, 0x0000c080);
2225 if (nv_device(priv)->chipset == 0xd9) { 2225 if (nv_device(priv)->chipset >= 0xd0) {
2226 for (i = 0x0440; i <= 0x0457; i++) 2226 for (i = 0x0440; i <= 0x0457; i++)
2227 nv_icmd(priv, i, 0x0000c080); 2227 nv_icmd(priv, i, 0x0000c080);
2228 } 2228 }
@@ -2789,7 +2789,7 @@ nvc0_grctx_generate(struct nvc0_graph_priv *priv)
2789 nv_icmd(priv, 0x00000585, 0x0000003f); 2789 nv_icmd(priv, 0x00000585, 0x0000003f);
2790 nv_icmd(priv, 0x00000576, 0x00000003); 2790 nv_icmd(priv, 0x00000576, 0x00000003);
2791 if (nv_device(priv)->chipset == 0xc1 || 2791 if (nv_device(priv)->chipset == 0xc1 ||
2792 nv_device(priv)->chipset == 0xd9) 2792 nv_device(priv)->chipset >= 0xd0)
2793 nv_icmd(priv, 0x0000057b, 0x00000059); 2793 nv_icmd(priv, 0x0000057b, 0x00000059);
2794 nv_icmd(priv, 0x00000586, 0x00000040); 2794 nv_icmd(priv, 0x00000586, 0x00000040);
2795 nv_icmd(priv, 0x00000582, 0x00000080); 2795 nv_icmd(priv, 0x00000582, 0x00000080);
@@ -2891,7 +2891,7 @@ nvc0_grctx_generate(struct nvc0_graph_priv *priv)
2891 nv_icmd(priv, 0x00000957, 0x00000003); 2891 nv_icmd(priv, 0x00000957, 0x00000003);
2892 nv_icmd(priv, 0x0000095e, 0x20164010); 2892 nv_icmd(priv, 0x0000095e, 0x20164010);
2893 nv_icmd(priv, 0x0000095f, 0x00000020); 2893 nv_icmd(priv, 0x0000095f, 0x00000020);
2894 if (nv_device(priv)->chipset == 0xd9) 2894 if (nv_device(priv)->chipset >= 0xd0)
2895 nv_icmd(priv, 0x0000097d, 0x00000020); 2895 nv_icmd(priv, 0x0000097d, 0x00000020);
2896 nv_icmd(priv, 0x00000683, 0x00000006); 2896 nv_icmd(priv, 0x00000683, 0x00000006);
2897 nv_icmd(priv, 0x00000685, 0x003fffff); 2897 nv_icmd(priv, 0x00000685, 0x003fffff);
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/fuc/gpcnvc0.fuc b/drivers/gpu/drm/nouveau/core/engine/graph/fuc/gpcnvc0.fuc
index b86cc60dcd56..f7055af0f2a6 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/fuc/gpcnvc0.fuc
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/fuc/gpcnvc0.fuc
@@ -87,6 +87,11 @@ chipsets:
87.b16 #nvd9_gpc_mmio_tail 87.b16 #nvd9_gpc_mmio_tail
88.b16 #nvd9_tpc_mmio_head 88.b16 #nvd9_tpc_mmio_head
89.b16 #nvd9_tpc_mmio_tail 89.b16 #nvd9_tpc_mmio_tail
90.b8 0xd7 0 0 0
91.b16 #nvd9_gpc_mmio_head
92.b16 #nvd9_gpc_mmio_tail
93.b16 #nvd9_tpc_mmio_head
94.b16 #nvd9_tpc_mmio_tail
90.b8 0 0 0 0 95.b8 0 0 0 0
91 96
92// GPC mmio lists 97// GPC mmio lists
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnvc0.fuc b/drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnvc0.fuc
index 0bcfa4d447e5..7fbdebb2bafb 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnvc0.fuc
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnvc0.fuc
@@ -62,6 +62,9 @@ chipsets:
62.b8 0xd9 0 0 0 62.b8 0xd9 0 0 0
63.b16 #nvd9_hub_mmio_head 63.b16 #nvd9_hub_mmio_head
64.b16 #nvd9_hub_mmio_tail 64.b16 #nvd9_hub_mmio_tail
65.b8 0xd7 0 0 0
66.b16 #nvd9_hub_mmio_head
67.b16 #nvd9_hub_mmio_tail
65.b8 0 0 0 0 68.b8 0 0 0 0
66 69
67nvc0_hub_mmio_head: 70nvc0_hub_mmio_head:
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
index 5ce49412e482..2dcd13796188 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
@@ -531,9 +531,10 @@ nvc0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
531{ 531{
532 struct nouveau_device *device = nv_device(parent); 532 struct nouveau_device *device = nv_device(parent);
533 struct nvc0_graph_priv *priv; 533 struct nvc0_graph_priv *priv;
534 bool enable = device->chipset != 0xd7;
534 int ret, i; 535 int ret, i;
535 536
536 ret = nouveau_graph_create(parent, engine, oclass, true, &priv); 537 ret = nouveau_graph_create(parent, engine, oclass, enable, &priv);
537 *pobject = nv_object(priv); 538 *pobject = nv_object(priv);
538 if (ret) 539 if (ret)
539 return ret; 540 return ret;
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.h b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.h
index af033dc24440..c870dad0f670 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.h
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.h
@@ -118,6 +118,7 @@ nvc0_graph_class(void *obj)
118 return 0x9197; 118 return 0x9197;
119 case 0xc8: 119 case 0xc8:
120 case 0xd9: 120 case 0xd9:
121 case 0xd7:
121 return 0x9297; 122 return 0x9297;
122 case 0xe4: 123 case 0xe4:
123 case 0xe7: 124 case 0xe7:
diff --git a/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c
index 4393eb4d6564..00f869ee53e3 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c
@@ -285,6 +285,34 @@ nvc0_identify(struct nouveau_device *device)
285 device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass; 285 device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass;
286 device->oclass[NVDEV_ENGINE_DISP ] = &nvd0_disp_oclass; 286 device->oclass[NVDEV_ENGINE_DISP ] = &nvd0_disp_oclass;
287 break; 287 break;
288 case 0xd7:
289 device->cname = "GF117";
290 device->oclass[NVDEV_SUBDEV_VBIOS ] = &nouveau_bios_oclass;
291 device->oclass[NVDEV_SUBDEV_GPIO ] = &nvd0_gpio_oclass;
292 device->oclass[NVDEV_SUBDEV_I2C ] = &nvd0_i2c_oclass;
293 device->oclass[NVDEV_SUBDEV_CLOCK ] = &nvc0_clock_oclass;
294 device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
295 device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
296 device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv50_devinit_oclass;
297 device->oclass[NVDEV_SUBDEV_MC ] = &nvc0_mc_oclass;
298 device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
299 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
300 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
301 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
302 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
303 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
304 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
305 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
306 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
307 device->oclass[NVDEV_ENGINE_FIFO ] = &nvc0_fifo_oclass;
308 device->oclass[NVDEV_ENGINE_SW ] = &nvc0_software_oclass;
309 device->oclass[NVDEV_ENGINE_GR ] = &nvc0_graph_oclass;
310 device->oclass[NVDEV_ENGINE_VP ] = &nvc0_vp_oclass;
311 device->oclass[NVDEV_ENGINE_BSP ] = &nvc0_bsp_oclass;
312 device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass;
313 device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass;
314 device->oclass[NVDEV_ENGINE_DISP ] = &nvd0_disp_oclass;
315 break;
288 default: 316 default:
289 nv_fatal(device, "unknown Fermi chipset\n"); 317 nv_fatal(device, "unknown Fermi chipset\n");
290 return -EINVAL; 318 return -EINVAL;