1c349dbc7Sjsg /*
2c349dbc7Sjsg * Copyright 2019 Advanced Micro Devices, Inc.
3c349dbc7Sjsg *
4c349dbc7Sjsg * Permission is hereby granted, free of charge, to any person obtaining a
5c349dbc7Sjsg * copy of this software and associated documentation files (the "Software"),
6c349dbc7Sjsg * to deal in the Software without restriction, including without limitation
7c349dbc7Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c349dbc7Sjsg * and/or sell copies of the Software, and to permit persons to whom the
9c349dbc7Sjsg * Software is furnished to do so, subject to the following conditions:
10c349dbc7Sjsg *
11c349dbc7Sjsg * The above copyright notice and this permission notice shall be included in
12c349dbc7Sjsg * all copies or substantial portions of the Software.
13c349dbc7Sjsg *
14c349dbc7Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15c349dbc7Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16c349dbc7Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17c349dbc7Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18c349dbc7Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19c349dbc7Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20c349dbc7Sjsg * OTHER DEALINGS IN THE SOFTWARE.
21c349dbc7Sjsg *
22c349dbc7Sjsg */
23c349dbc7Sjsg #include <linux/firmware.h>
24c349dbc7Sjsg #include <linux/slab.h>
25c349dbc7Sjsg #include <linux/module.h>
26c349dbc7Sjsg #include <linux/pci.h>
27c349dbc7Sjsg
285ca02815Sjsg #include <drm/amdgpu_drm.h>
295ca02815Sjsg
30c349dbc7Sjsg #include "amdgpu.h"
31c349dbc7Sjsg #include "amdgpu_atombios.h"
32c349dbc7Sjsg #include "amdgpu_ih.h"
33c349dbc7Sjsg #include "amdgpu_uvd.h"
34c349dbc7Sjsg #include "amdgpu_vce.h"
35c349dbc7Sjsg #include "amdgpu_ucode.h"
36c349dbc7Sjsg #include "amdgpu_psp.h"
37c349dbc7Sjsg #include "atom.h"
38c349dbc7Sjsg #include "amd_pcie.h"
39c349dbc7Sjsg
40c349dbc7Sjsg #include "gc/gc_10_1_0_offset.h"
41c349dbc7Sjsg #include "gc/gc_10_1_0_sh_mask.h"
42ad8b1aafSjsg #include "mp/mp_11_0_offset.h"
43c349dbc7Sjsg
44c349dbc7Sjsg #include "soc15.h"
45c349dbc7Sjsg #include "soc15_common.h"
46c349dbc7Sjsg #include "gmc_v10_0.h"
47c349dbc7Sjsg #include "gfxhub_v2_0.h"
48c349dbc7Sjsg #include "mmhub_v2_0.h"
49c349dbc7Sjsg #include "nbio_v2_3.h"
505ca02815Sjsg #include "nbio_v7_2.h"
515ca02815Sjsg #include "hdp_v5_0.h"
52c349dbc7Sjsg #include "nv.h"
53c349dbc7Sjsg #include "navi10_ih.h"
54c349dbc7Sjsg #include "gfx_v10_0.h"
55c349dbc7Sjsg #include "sdma_v5_0.h"
56ad8b1aafSjsg #include "sdma_v5_2.h"
57c349dbc7Sjsg #include "vcn_v2_0.h"
58c349dbc7Sjsg #include "jpeg_v2_0.h"
59ad8b1aafSjsg #include "vcn_v3_0.h"
60ad8b1aafSjsg #include "jpeg_v3_0.h"
615ca02815Sjsg #include "amdgpu_vkms.h"
62c349dbc7Sjsg #include "mes_v10_1.h"
63c349dbc7Sjsg #include "mxgpu_nv.h"
645ca02815Sjsg #include "smuio_v11_0.h"
655ca02815Sjsg #include "smuio_v11_0_6.h"
66c349dbc7Sjsg
67c349dbc7Sjsg static const struct amd_ip_funcs nv_common_ip_funcs;
68c349dbc7Sjsg
695ca02815Sjsg /* Navi */
70*f005ef32Sjsg static const struct amdgpu_video_codec_info nv_video_codecs_encode_array[] = {
715ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)},
725ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)},
735ca02815Sjsg };
745ca02815Sjsg
75*f005ef32Sjsg static const struct amdgpu_video_codecs nv_video_codecs_encode = {
765ca02815Sjsg .codec_count = ARRAY_SIZE(nv_video_codecs_encode_array),
775ca02815Sjsg .codec_array = nv_video_codecs_encode_array,
785ca02815Sjsg };
795ca02815Sjsg
805ca02815Sjsg /* Navi1x */
81*f005ef32Sjsg static const struct amdgpu_video_codec_info nv_video_codecs_decode_array[] = {
821bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)},
831bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)},
841bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)},
851bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)},
865ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
875ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
885ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
895ca02815Sjsg };
905ca02815Sjsg
91*f005ef32Sjsg static const struct amdgpu_video_codecs nv_video_codecs_decode = {
925ca02815Sjsg .codec_count = ARRAY_SIZE(nv_video_codecs_decode_array),
935ca02815Sjsg .codec_array = nv_video_codecs_decode_array,
945ca02815Sjsg };
955ca02815Sjsg
965ca02815Sjsg /* Sienna Cichlid */
97*f005ef32Sjsg static const struct amdgpu_video_codec_info sc_video_codecs_encode_array[] = {
98*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2160, 0)},
99*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 7680, 4352, 0)},
100*f005ef32Sjsg };
101*f005ef32Sjsg
102*f005ef32Sjsg static const struct amdgpu_video_codecs sc_video_codecs_encode = {
103*f005ef32Sjsg .codec_count = ARRAY_SIZE(sc_video_codecs_encode_array),
104*f005ef32Sjsg .codec_array = sc_video_codecs_encode_array,
105*f005ef32Sjsg };
106*f005ef32Sjsg
107*f005ef32Sjsg static const struct amdgpu_video_codec_info sc_video_codecs_decode_array_vcn0[] = {
1081bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)},
1091bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)},
1101bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)},
1111bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)},
1125ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
1135ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
1145ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
1155ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)},
1165ca02815Sjsg };
1175ca02815Sjsg
118*f005ef32Sjsg static const struct amdgpu_video_codec_info sc_video_codecs_decode_array_vcn1[] = {
119*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)},
120*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)},
121*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)},
122*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)},
123*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
124*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
125*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
126*f005ef32Sjsg };
127*f005ef32Sjsg
128*f005ef32Sjsg static const struct amdgpu_video_codecs sc_video_codecs_decode_vcn0 = {
129*f005ef32Sjsg .codec_count = ARRAY_SIZE(sc_video_codecs_decode_array_vcn0),
130*f005ef32Sjsg .codec_array = sc_video_codecs_decode_array_vcn0,
131*f005ef32Sjsg };
132*f005ef32Sjsg
133*f005ef32Sjsg static const struct amdgpu_video_codecs sc_video_codecs_decode_vcn1 = {
134*f005ef32Sjsg .codec_count = ARRAY_SIZE(sc_video_codecs_decode_array_vcn1),
135*f005ef32Sjsg .codec_array = sc_video_codecs_decode_array_vcn1,
1365ca02815Sjsg };
1375ca02815Sjsg
1385ca02815Sjsg /* SRIOV Sienna Cichlid, not const since data is controlled by host */
139*f005ef32Sjsg static struct amdgpu_video_codec_info sriov_sc_video_codecs_encode_array[] = {
140*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2160, 0)},
141*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 7680, 4352, 0)},
1425ca02815Sjsg };
1435ca02815Sjsg
144*f005ef32Sjsg static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array_vcn0[] = {
1451bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)},
1461bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)},
1471bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)},
1481bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)},
1495ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
1505ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
1515ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
1525ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)},
1535ca02815Sjsg };
1545ca02815Sjsg
155*f005ef32Sjsg static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array_vcn1[] = {
156*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)},
157*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)},
158*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)},
159*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)},
160*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
161*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
162*f005ef32Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
163*f005ef32Sjsg };
164*f005ef32Sjsg
165*f005ef32Sjsg static struct amdgpu_video_codecs sriov_sc_video_codecs_encode = {
1665ca02815Sjsg .codec_count = ARRAY_SIZE(sriov_sc_video_codecs_encode_array),
1675ca02815Sjsg .codec_array = sriov_sc_video_codecs_encode_array,
1685ca02815Sjsg };
1695ca02815Sjsg
170*f005ef32Sjsg static struct amdgpu_video_codecs sriov_sc_video_codecs_decode_vcn0 = {
171*f005ef32Sjsg .codec_count = ARRAY_SIZE(sriov_sc_video_codecs_decode_array_vcn0),
172*f005ef32Sjsg .codec_array = sriov_sc_video_codecs_decode_array_vcn0,
173*f005ef32Sjsg };
174*f005ef32Sjsg
175*f005ef32Sjsg static struct amdgpu_video_codecs sriov_sc_video_codecs_decode_vcn1 = {
176*f005ef32Sjsg .codec_count = ARRAY_SIZE(sriov_sc_video_codecs_decode_array_vcn1),
177*f005ef32Sjsg .codec_array = sriov_sc_video_codecs_decode_array_vcn1,
1785ca02815Sjsg };
1795ca02815Sjsg
1805ca02815Sjsg /* Beige Goby*/
1815ca02815Sjsg static const struct amdgpu_video_codec_info bg_video_codecs_decode_array[] = {
1821bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)},
1835ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
1845ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
1855ca02815Sjsg };
1865ca02815Sjsg
1875ca02815Sjsg static const struct amdgpu_video_codecs bg_video_codecs_decode = {
1885ca02815Sjsg .codec_count = ARRAY_SIZE(bg_video_codecs_decode_array),
1895ca02815Sjsg .codec_array = bg_video_codecs_decode_array,
1905ca02815Sjsg };
1915ca02815Sjsg
1925ca02815Sjsg static const struct amdgpu_video_codecs bg_video_codecs_encode = {
1935ca02815Sjsg .codec_count = 0,
1945ca02815Sjsg .codec_array = NULL,
1955ca02815Sjsg };
1965ca02815Sjsg
1975ca02815Sjsg /* Yellow Carp*/
1985ca02815Sjsg static const struct amdgpu_video_codec_info yc_video_codecs_decode_array[] = {
1991bb76ff1Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)},
2005ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
2015ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
2025ca02815Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
203162559e7Sjsg {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)},
2045ca02815Sjsg };
2055ca02815Sjsg
2065ca02815Sjsg static const struct amdgpu_video_codecs yc_video_codecs_decode = {
2075ca02815Sjsg .codec_count = ARRAY_SIZE(yc_video_codecs_decode_array),
2085ca02815Sjsg .codec_array = yc_video_codecs_decode_array,
2095ca02815Sjsg };
2105ca02815Sjsg
nv_query_video_codecs(struct amdgpu_device * adev,bool encode,const struct amdgpu_video_codecs ** codecs)2115ca02815Sjsg static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,
2125ca02815Sjsg const struct amdgpu_video_codecs **codecs)
2135ca02815Sjsg {
214*f005ef32Sjsg if (adev->vcn.num_vcn_inst == hweight8(adev->vcn.harvest_config))
215*f005ef32Sjsg return -EINVAL;
216*f005ef32Sjsg
2171bb76ff1Sjsg switch (adev->ip_versions[UVD_HWIP][0]) {
2181bb76ff1Sjsg case IP_VERSION(3, 0, 0):
2191bb76ff1Sjsg case IP_VERSION(3, 0, 64):
2201bb76ff1Sjsg case IP_VERSION(3, 0, 192):
2215ca02815Sjsg if (amdgpu_sriov_vf(adev)) {
222*f005ef32Sjsg if (adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) {
2235ca02815Sjsg if (encode)
2245ca02815Sjsg *codecs = &sriov_sc_video_codecs_encode;
2255ca02815Sjsg else
226*f005ef32Sjsg *codecs = &sriov_sc_video_codecs_decode_vcn1;
2275ca02815Sjsg } else {
2285ca02815Sjsg if (encode)
229*f005ef32Sjsg *codecs = &sriov_sc_video_codecs_encode;
2305ca02815Sjsg else
231*f005ef32Sjsg *codecs = &sriov_sc_video_codecs_decode_vcn0;
232*f005ef32Sjsg }
233*f005ef32Sjsg } else {
234*f005ef32Sjsg if (adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) {
235*f005ef32Sjsg if (encode)
236*f005ef32Sjsg *codecs = &sc_video_codecs_encode;
237*f005ef32Sjsg else
238*f005ef32Sjsg *codecs = &sc_video_codecs_decode_vcn1;
239*f005ef32Sjsg } else {
240*f005ef32Sjsg if (encode)
241*f005ef32Sjsg *codecs = &sc_video_codecs_encode;
242*f005ef32Sjsg else
243*f005ef32Sjsg *codecs = &sc_video_codecs_decode_vcn0;
244*f005ef32Sjsg }
2455ca02815Sjsg }
2465ca02815Sjsg return 0;
2471bb76ff1Sjsg case IP_VERSION(3, 0, 16):
2481bb76ff1Sjsg case IP_VERSION(3, 0, 2):
2495ca02815Sjsg if (encode)
250*f005ef32Sjsg *codecs = &sc_video_codecs_encode;
2515ca02815Sjsg else
252*f005ef32Sjsg *codecs = &sc_video_codecs_decode_vcn0;
2535ca02815Sjsg return 0;
2541bb76ff1Sjsg case IP_VERSION(3, 1, 1):
2551bb76ff1Sjsg case IP_VERSION(3, 1, 2):
2565ca02815Sjsg if (encode)
257*f005ef32Sjsg *codecs = &sc_video_codecs_encode;
2585ca02815Sjsg else
2595ca02815Sjsg *codecs = &yc_video_codecs_decode;
2605ca02815Sjsg return 0;
2611bb76ff1Sjsg case IP_VERSION(3, 0, 33):
2625ca02815Sjsg if (encode)
2635ca02815Sjsg *codecs = &bg_video_codecs_encode;
2645ca02815Sjsg else
2655ca02815Sjsg *codecs = &bg_video_codecs_decode;
2665ca02815Sjsg return 0;
2671bb76ff1Sjsg case IP_VERSION(2, 0, 0):
2681bb76ff1Sjsg case IP_VERSION(2, 0, 2):
2695ca02815Sjsg if (encode)
2705ca02815Sjsg *codecs = &nv_video_codecs_encode;
2715ca02815Sjsg else
2725ca02815Sjsg *codecs = &nv_video_codecs_decode;
2735ca02815Sjsg return 0;
2745ca02815Sjsg default:
2755ca02815Sjsg return -EINVAL;
2765ca02815Sjsg }
2775ca02815Sjsg }
2785ca02815Sjsg
nv_didt_rreg(struct amdgpu_device * adev,u32 reg)279c349dbc7Sjsg static u32 nv_didt_rreg(struct amdgpu_device *adev, u32 reg)
280c349dbc7Sjsg {
281c349dbc7Sjsg unsigned long flags, address, data;
282c349dbc7Sjsg u32 r;
283c349dbc7Sjsg
284c349dbc7Sjsg address = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_INDEX);
285c349dbc7Sjsg data = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_DATA);
286c349dbc7Sjsg
287c349dbc7Sjsg spin_lock_irqsave(&adev->didt_idx_lock, flags);
288c349dbc7Sjsg WREG32(address, (reg));
289c349dbc7Sjsg r = RREG32(data);
290c349dbc7Sjsg spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
291c349dbc7Sjsg return r;
292c349dbc7Sjsg }
293c349dbc7Sjsg
nv_didt_wreg(struct amdgpu_device * adev,u32 reg,u32 v)294c349dbc7Sjsg static void nv_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
295c349dbc7Sjsg {
296c349dbc7Sjsg unsigned long flags, address, data;
297c349dbc7Sjsg
298c349dbc7Sjsg address = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_INDEX);
299c349dbc7Sjsg data = SOC15_REG_OFFSET(GC, 0, mmDIDT_IND_DATA);
300c349dbc7Sjsg
301c349dbc7Sjsg spin_lock_irqsave(&adev->didt_idx_lock, flags);
302c349dbc7Sjsg WREG32(address, (reg));
303c349dbc7Sjsg WREG32(data, (v));
304c349dbc7Sjsg spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
305c349dbc7Sjsg }
306c349dbc7Sjsg
nv_get_config_memsize(struct amdgpu_device * adev)307c349dbc7Sjsg static u32 nv_get_config_memsize(struct amdgpu_device *adev)
308c349dbc7Sjsg {
309c349dbc7Sjsg return adev->nbio.funcs->get_memsize(adev);
310c349dbc7Sjsg }
311c349dbc7Sjsg
nv_get_xclk(struct amdgpu_device * adev)312c349dbc7Sjsg static u32 nv_get_xclk(struct amdgpu_device *adev)
313c349dbc7Sjsg {
314c349dbc7Sjsg return adev->clock.spll.reference_freq;
315c349dbc7Sjsg }
316c349dbc7Sjsg
317c349dbc7Sjsg
nv_grbm_select(struct amdgpu_device * adev,u32 me,u32 pipe,u32 queue,u32 vmid)318c349dbc7Sjsg void nv_grbm_select(struct amdgpu_device *adev,
319c349dbc7Sjsg u32 me, u32 pipe, u32 queue, u32 vmid)
320c349dbc7Sjsg {
321c349dbc7Sjsg u32 grbm_gfx_cntl = 0;
322c349dbc7Sjsg grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, PIPEID, pipe);
323c349dbc7Sjsg grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, MEID, me);
324c349dbc7Sjsg grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, VMID, vmid);
325c349dbc7Sjsg grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, QUEUEID, queue);
326c349dbc7Sjsg
3275ca02815Sjsg WREG32_SOC15(GC, 0, mmGRBM_GFX_CNTL, grbm_gfx_cntl);
328c349dbc7Sjsg }
329c349dbc7Sjsg
nv_read_disabled_bios(struct amdgpu_device * adev)330c349dbc7Sjsg static bool nv_read_disabled_bios(struct amdgpu_device *adev)
331c349dbc7Sjsg {
332c349dbc7Sjsg /* todo */
333c349dbc7Sjsg return false;
334c349dbc7Sjsg }
335c349dbc7Sjsg
336c349dbc7Sjsg static struct soc15_allowed_register_entry nv_allowed_read_registers[] = {
337c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS)},
338c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS2)},
339c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE0)},
340c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE1)},
341c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE2)},
342c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE3)},
343c349dbc7Sjsg { SOC15_REG_ENTRY(SDMA0, 0, mmSDMA0_STATUS_REG)},
344c349dbc7Sjsg { SOC15_REG_ENTRY(SDMA1, 0, mmSDMA1_STATUS_REG)},
345c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_STAT)},
346c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT1)},
347c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT2)},
348c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT3)},
349c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_CPF_BUSY_STAT)},
350c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_CPF_STALLED_STAT1)},
351c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_CPF_STATUS)},
352c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_BUSY_STAT)},
353c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STALLED_STAT1)},
354c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STATUS)},
355c349dbc7Sjsg { SOC15_REG_ENTRY(GC, 0, mmGB_ADDR_CONFIG)},
356c349dbc7Sjsg };
357c349dbc7Sjsg
nv_read_indexed_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset)358c349dbc7Sjsg static uint32_t nv_read_indexed_register(struct amdgpu_device *adev, u32 se_num,
359c349dbc7Sjsg u32 sh_num, u32 reg_offset)
360c349dbc7Sjsg {
361c349dbc7Sjsg uint32_t val;
362c349dbc7Sjsg
363c349dbc7Sjsg mutex_lock(&adev->grbm_idx_mutex);
364c349dbc7Sjsg if (se_num != 0xffffffff || sh_num != 0xffffffff)
365*f005ef32Sjsg amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
366c349dbc7Sjsg
367c349dbc7Sjsg val = RREG32(reg_offset);
368c349dbc7Sjsg
369c349dbc7Sjsg if (se_num != 0xffffffff || sh_num != 0xffffffff)
370*f005ef32Sjsg amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
371c349dbc7Sjsg mutex_unlock(&adev->grbm_idx_mutex);
372c349dbc7Sjsg return val;
373c349dbc7Sjsg }
374c349dbc7Sjsg
nv_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)375c349dbc7Sjsg static uint32_t nv_get_register_value(struct amdgpu_device *adev,
376c349dbc7Sjsg bool indexed, u32 se_num,
377c349dbc7Sjsg u32 sh_num, u32 reg_offset)
378c349dbc7Sjsg {
379c349dbc7Sjsg if (indexed) {
380c349dbc7Sjsg return nv_read_indexed_register(adev, se_num, sh_num, reg_offset);
381c349dbc7Sjsg } else {
382c349dbc7Sjsg if (reg_offset == SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG))
383c349dbc7Sjsg return adev->gfx.config.gb_addr_config;
384c349dbc7Sjsg return RREG32(reg_offset);
385c349dbc7Sjsg }
386c349dbc7Sjsg }
387c349dbc7Sjsg
nv_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)388c349dbc7Sjsg static int nv_read_register(struct amdgpu_device *adev, u32 se_num,
389c349dbc7Sjsg u32 sh_num, u32 reg_offset, u32 *value)
390c349dbc7Sjsg {
391c349dbc7Sjsg uint32_t i;
392c349dbc7Sjsg struct soc15_allowed_register_entry *en;
393c349dbc7Sjsg
394c349dbc7Sjsg *value = 0;
395c349dbc7Sjsg for (i = 0; i < ARRAY_SIZE(nv_allowed_read_registers); i++) {
396c349dbc7Sjsg en = &nv_allowed_read_registers[i];
397e474b851Sjsg if (!adev->reg_offset[en->hwip][en->inst])
398e474b851Sjsg continue;
399e474b851Sjsg else if (reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg]
4001bb76ff1Sjsg + en->reg_offset))
401c349dbc7Sjsg continue;
402c349dbc7Sjsg
403c349dbc7Sjsg *value = nv_get_register_value(adev,
404c349dbc7Sjsg nv_allowed_read_registers[i].grbm_indexed,
405c349dbc7Sjsg se_num, sh_num, reg_offset);
406c349dbc7Sjsg return 0;
407c349dbc7Sjsg }
408c349dbc7Sjsg return -EINVAL;
409c349dbc7Sjsg }
410c349dbc7Sjsg
nv_asic_mode2_reset(struct amdgpu_device * adev)4115ca02815Sjsg static int nv_asic_mode2_reset(struct amdgpu_device *adev)
412c349dbc7Sjsg {
413c349dbc7Sjsg u32 i;
414c349dbc7Sjsg int ret = 0;
415c349dbc7Sjsg
416c349dbc7Sjsg amdgpu_atombios_scratch_regs_engine_hung(adev, true);
417c349dbc7Sjsg
418c349dbc7Sjsg /* disable BM */
419c349dbc7Sjsg pci_clear_master(adev->pdev);
420c349dbc7Sjsg
421ad8b1aafSjsg amdgpu_device_cache_pci_state(adev->pdev);
422c349dbc7Sjsg
4235ca02815Sjsg ret = amdgpu_dpm_mode2_reset(adev);
424c349dbc7Sjsg if (ret)
4255ca02815Sjsg dev_err(adev->dev, "GPU mode2 reset failed\n");
4265ca02815Sjsg
427ad8b1aafSjsg amdgpu_device_load_pci_state(adev->pdev);
428c349dbc7Sjsg
429c349dbc7Sjsg /* wait for asic to come out of reset */
430c349dbc7Sjsg for (i = 0; i < adev->usec_timeout; i++) {
431c349dbc7Sjsg u32 memsize = adev->nbio.funcs->get_memsize(adev);
432c349dbc7Sjsg
433c349dbc7Sjsg if (memsize != 0xffffffff)
434c349dbc7Sjsg break;
435c349dbc7Sjsg udelay(1);
436c349dbc7Sjsg }
437c349dbc7Sjsg
438c349dbc7Sjsg amdgpu_atombios_scratch_regs_engine_hung(adev, false);
439c349dbc7Sjsg
440c349dbc7Sjsg return ret;
441c349dbc7Sjsg }
442c349dbc7Sjsg
443c349dbc7Sjsg static enum amd_reset_method
nv_asic_reset_method(struct amdgpu_device * adev)444c349dbc7Sjsg nv_asic_reset_method(struct amdgpu_device *adev)
445c349dbc7Sjsg {
446ad8b1aafSjsg if (amdgpu_reset_method == AMD_RESET_METHOD_MODE1 ||
4475ca02815Sjsg amdgpu_reset_method == AMD_RESET_METHOD_MODE2 ||
4485ca02815Sjsg amdgpu_reset_method == AMD_RESET_METHOD_BACO ||
4495ca02815Sjsg amdgpu_reset_method == AMD_RESET_METHOD_PCI)
450ad8b1aafSjsg return amdgpu_reset_method;
451ad8b1aafSjsg
452ad8b1aafSjsg if (amdgpu_reset_method != -1)
453ad8b1aafSjsg dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
454ad8b1aafSjsg amdgpu_reset_method);
455ad8b1aafSjsg
4561bb76ff1Sjsg switch (adev->ip_versions[MP1_HWIP][0]) {
4571bb76ff1Sjsg case IP_VERSION(11, 5, 0):
4581bb76ff1Sjsg case IP_VERSION(13, 0, 1):
4591bb76ff1Sjsg case IP_VERSION(13, 0, 3):
4601bb76ff1Sjsg case IP_VERSION(13, 0, 5):
4611bb76ff1Sjsg case IP_VERSION(13, 0, 8):
4625ca02815Sjsg return AMD_RESET_METHOD_MODE2;
4631bb76ff1Sjsg case IP_VERSION(11, 0, 7):
4641bb76ff1Sjsg case IP_VERSION(11, 0, 11):
4651bb76ff1Sjsg case IP_VERSION(11, 0, 12):
4661bb76ff1Sjsg case IP_VERSION(11, 0, 13):
467ad8b1aafSjsg return AMD_RESET_METHOD_MODE1;
468ad8b1aafSjsg default:
4695ca02815Sjsg if (amdgpu_dpm_is_baco_supported(adev))
470c349dbc7Sjsg return AMD_RESET_METHOD_BACO;
471c349dbc7Sjsg else
472c349dbc7Sjsg return AMD_RESET_METHOD_MODE1;
473c349dbc7Sjsg }
474ad8b1aafSjsg }
475c349dbc7Sjsg
nv_asic_reset(struct amdgpu_device * adev)476c349dbc7Sjsg static int nv_asic_reset(struct amdgpu_device *adev)
477c349dbc7Sjsg {
478c349dbc7Sjsg int ret = 0;
479c349dbc7Sjsg
4805ca02815Sjsg switch (nv_asic_reset_method(adev)) {
4815ca02815Sjsg case AMD_RESET_METHOD_PCI:
4825ca02815Sjsg dev_info(adev->dev, "PCI reset\n");
4835ca02815Sjsg ret = amdgpu_device_pci_reset(adev);
4845ca02815Sjsg break;
4855ca02815Sjsg case AMD_RESET_METHOD_BACO:
486ad8b1aafSjsg dev_info(adev->dev, "BACO reset\n");
4875ca02815Sjsg ret = amdgpu_dpm_baco_reset(adev);
4885ca02815Sjsg break;
4895ca02815Sjsg case AMD_RESET_METHOD_MODE2:
4905ca02815Sjsg dev_info(adev->dev, "MODE2 reset\n");
4915ca02815Sjsg ret = nv_asic_mode2_reset(adev);
4925ca02815Sjsg break;
4935ca02815Sjsg default:
494ad8b1aafSjsg dev_info(adev->dev, "MODE1 reset\n");
4955ca02815Sjsg ret = amdgpu_device_mode1_reset(adev);
4965ca02815Sjsg break;
497c349dbc7Sjsg }
498c349dbc7Sjsg
499c349dbc7Sjsg return ret;
500c349dbc7Sjsg }
501c349dbc7Sjsg
nv_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)502c349dbc7Sjsg static int nv_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
503c349dbc7Sjsg {
504c349dbc7Sjsg /* todo */
505c349dbc7Sjsg return 0;
506c349dbc7Sjsg }
507c349dbc7Sjsg
nv_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)508c349dbc7Sjsg static int nv_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
509c349dbc7Sjsg {
510c349dbc7Sjsg /* todo */
511c349dbc7Sjsg return 0;
512c349dbc7Sjsg }
513c349dbc7Sjsg
nv_program_aspm(struct amdgpu_device * adev)514c349dbc7Sjsg static void nv_program_aspm(struct amdgpu_device *adev)
515c349dbc7Sjsg {
516e73b7337Sjsg if (!amdgpu_device_should_use_aspm(adev) || !amdgpu_device_aspm_support_quirk())
517c349dbc7Sjsg return;
518c349dbc7Sjsg
5195ca02815Sjsg if (!(adev->flags & AMD_IS_APU) &&
5205ca02815Sjsg (adev->nbio.funcs->program_aspm))
5215ca02815Sjsg adev->nbio.funcs->program_aspm(adev);
5225ca02815Sjsg
523c349dbc7Sjsg }
524c349dbc7Sjsg
525*f005ef32Sjsg const struct amdgpu_ip_block_version nv_common_ip_block = {
526c349dbc7Sjsg .type = AMD_IP_BLOCK_TYPE_COMMON,
527c349dbc7Sjsg .major = 1,
528c349dbc7Sjsg .minor = 0,
529c349dbc7Sjsg .rev = 0,
530c349dbc7Sjsg .funcs = &nv_common_ip_funcs,
531c349dbc7Sjsg };
532c349dbc7Sjsg
nv_set_virt_ops(struct amdgpu_device * adev)533ad8b1aafSjsg void nv_set_virt_ops(struct amdgpu_device *adev)
534ad8b1aafSjsg {
535ad8b1aafSjsg adev->virt.ops = &xgpu_nv_virt_ops;
536ad8b1aafSjsg }
537ad8b1aafSjsg
nv_need_full_reset(struct amdgpu_device * adev)538c349dbc7Sjsg static bool nv_need_full_reset(struct amdgpu_device *adev)
539c349dbc7Sjsg {
540c349dbc7Sjsg return true;
541c349dbc7Sjsg }
542c349dbc7Sjsg
nv_need_reset_on_init(struct amdgpu_device * adev)543c349dbc7Sjsg static bool nv_need_reset_on_init(struct amdgpu_device *adev)
544c349dbc7Sjsg {
545c349dbc7Sjsg u32 sol_reg;
546c349dbc7Sjsg
547c349dbc7Sjsg if (adev->flags & AMD_IS_APU)
548c349dbc7Sjsg return false;
549c349dbc7Sjsg
550c349dbc7Sjsg /* Check sOS sign of life register to confirm sys driver and sOS
551c349dbc7Sjsg * are already been loaded.
552c349dbc7Sjsg */
553c349dbc7Sjsg sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
554c349dbc7Sjsg if (sol_reg)
555c349dbc7Sjsg return true;
556ad8b1aafSjsg
557c349dbc7Sjsg return false;
558c349dbc7Sjsg }
559c349dbc7Sjsg
nv_init_doorbell_index(struct amdgpu_device * adev)560c349dbc7Sjsg static void nv_init_doorbell_index(struct amdgpu_device *adev)
561c349dbc7Sjsg {
562c349dbc7Sjsg adev->doorbell_index.kiq = AMDGPU_NAVI10_DOORBELL_KIQ;
563c349dbc7Sjsg adev->doorbell_index.mec_ring0 = AMDGPU_NAVI10_DOORBELL_MEC_RING0;
564c349dbc7Sjsg adev->doorbell_index.mec_ring1 = AMDGPU_NAVI10_DOORBELL_MEC_RING1;
565c349dbc7Sjsg adev->doorbell_index.mec_ring2 = AMDGPU_NAVI10_DOORBELL_MEC_RING2;
566c349dbc7Sjsg adev->doorbell_index.mec_ring3 = AMDGPU_NAVI10_DOORBELL_MEC_RING3;
567c349dbc7Sjsg adev->doorbell_index.mec_ring4 = AMDGPU_NAVI10_DOORBELL_MEC_RING4;
568c349dbc7Sjsg adev->doorbell_index.mec_ring5 = AMDGPU_NAVI10_DOORBELL_MEC_RING5;
569c349dbc7Sjsg adev->doorbell_index.mec_ring6 = AMDGPU_NAVI10_DOORBELL_MEC_RING6;
570c349dbc7Sjsg adev->doorbell_index.mec_ring7 = AMDGPU_NAVI10_DOORBELL_MEC_RING7;
571c349dbc7Sjsg adev->doorbell_index.userqueue_start = AMDGPU_NAVI10_DOORBELL_USERQUEUE_START;
572c349dbc7Sjsg adev->doorbell_index.userqueue_end = AMDGPU_NAVI10_DOORBELL_USERQUEUE_END;
573c349dbc7Sjsg adev->doorbell_index.gfx_ring0 = AMDGPU_NAVI10_DOORBELL_GFX_RING0;
574c349dbc7Sjsg adev->doorbell_index.gfx_ring1 = AMDGPU_NAVI10_DOORBELL_GFX_RING1;
5751bb76ff1Sjsg adev->doorbell_index.gfx_userqueue_start =
5761bb76ff1Sjsg AMDGPU_NAVI10_DOORBELL_GFX_USERQUEUE_START;
5771bb76ff1Sjsg adev->doorbell_index.gfx_userqueue_end =
5781bb76ff1Sjsg AMDGPU_NAVI10_DOORBELL_GFX_USERQUEUE_END;
5791bb76ff1Sjsg adev->doorbell_index.mes_ring0 = AMDGPU_NAVI10_DOORBELL_MES_RING0;
5801bb76ff1Sjsg adev->doorbell_index.mes_ring1 = AMDGPU_NAVI10_DOORBELL_MES_RING1;
581c349dbc7Sjsg adev->doorbell_index.sdma_engine[0] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0;
582c349dbc7Sjsg adev->doorbell_index.sdma_engine[1] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE1;
583ad8b1aafSjsg adev->doorbell_index.sdma_engine[2] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE2;
584ad8b1aafSjsg adev->doorbell_index.sdma_engine[3] = AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE3;
585c349dbc7Sjsg adev->doorbell_index.ih = AMDGPU_NAVI10_DOORBELL_IH;
586c349dbc7Sjsg adev->doorbell_index.vcn.vcn_ring0_1 = AMDGPU_NAVI10_DOORBELL64_VCN0_1;
587c349dbc7Sjsg adev->doorbell_index.vcn.vcn_ring2_3 = AMDGPU_NAVI10_DOORBELL64_VCN2_3;
588c349dbc7Sjsg adev->doorbell_index.vcn.vcn_ring4_5 = AMDGPU_NAVI10_DOORBELL64_VCN4_5;
589c349dbc7Sjsg adev->doorbell_index.vcn.vcn_ring6_7 = AMDGPU_NAVI10_DOORBELL64_VCN6_7;
590c349dbc7Sjsg adev->doorbell_index.first_non_cp = AMDGPU_NAVI10_DOORBELL64_FIRST_NON_CP;
591c349dbc7Sjsg adev->doorbell_index.last_non_cp = AMDGPU_NAVI10_DOORBELL64_LAST_NON_CP;
592c349dbc7Sjsg
593c349dbc7Sjsg adev->doorbell_index.max_assignment = AMDGPU_NAVI10_DOORBELL_MAX_ASSIGNMENT << 1;
594c349dbc7Sjsg adev->doorbell_index.sdma_doorbell_range = 20;
595c349dbc7Sjsg }
596c349dbc7Sjsg
nv_pre_asic_init(struct amdgpu_device * adev)597ad8b1aafSjsg static void nv_pre_asic_init(struct amdgpu_device *adev)
598ad8b1aafSjsg {
599ad8b1aafSjsg }
600ad8b1aafSjsg
nv_update_umd_stable_pstate(struct amdgpu_device * adev,bool enter)6015ca02815Sjsg static int nv_update_umd_stable_pstate(struct amdgpu_device *adev,
6025ca02815Sjsg bool enter)
6035ca02815Sjsg {
6045ca02815Sjsg if (enter)
605*f005ef32Sjsg amdgpu_gfx_rlc_enter_safe_mode(adev, 0);
6065ca02815Sjsg else
607*f005ef32Sjsg amdgpu_gfx_rlc_exit_safe_mode(adev, 0);
6085ca02815Sjsg
6095ca02815Sjsg if (adev->gfx.funcs->update_perfmon_mgcg)
6105ca02815Sjsg adev->gfx.funcs->update_perfmon_mgcg(adev, !enter);
6115ca02815Sjsg
6125ca02815Sjsg if (!(adev->flags & AMD_IS_APU) &&
6131bb76ff1Sjsg (adev->nbio.funcs->enable_aspm) &&
6141bb76ff1Sjsg amdgpu_device_should_use_aspm(adev))
6155ca02815Sjsg adev->nbio.funcs->enable_aspm(adev, !enter);
6165ca02815Sjsg
6175ca02815Sjsg return 0;
6185ca02815Sjsg }
6195ca02815Sjsg
620*f005ef32Sjsg static const struct amdgpu_asic_funcs nv_asic_funcs = {
621c349dbc7Sjsg .read_disabled_bios = &nv_read_disabled_bios,
6221bb76ff1Sjsg .read_bios_from_rom = &amdgpu_soc15_read_bios_from_rom,
623c349dbc7Sjsg .read_register = &nv_read_register,
624c349dbc7Sjsg .reset = &nv_asic_reset,
625c349dbc7Sjsg .reset_method = &nv_asic_reset_method,
626c349dbc7Sjsg .get_xclk = &nv_get_xclk,
627c349dbc7Sjsg .set_uvd_clocks = &nv_set_uvd_clocks,
628c349dbc7Sjsg .set_vce_clocks = &nv_set_vce_clocks,
629c349dbc7Sjsg .get_config_memsize = &nv_get_config_memsize,
630c349dbc7Sjsg .init_doorbell_index = &nv_init_doorbell_index,
631c349dbc7Sjsg .need_full_reset = &nv_need_full_reset,
632c349dbc7Sjsg .need_reset_on_init = &nv_need_reset_on_init,
633*f005ef32Sjsg .get_pcie_replay_count = &amdgpu_nbio_get_pcie_replay_count,
6345ca02815Sjsg .supports_baco = &amdgpu_dpm_is_baco_supported,
635ad8b1aafSjsg .pre_asic_init = &nv_pre_asic_init,
6365ca02815Sjsg .update_umd_stable_pstate = &nv_update_umd_stable_pstate,
6375ca02815Sjsg .query_video_codecs = &nv_query_video_codecs,
638c349dbc7Sjsg };
639c349dbc7Sjsg
nv_common_early_init(void * handle)640c349dbc7Sjsg static int nv_common_early_init(void *handle)
641c349dbc7Sjsg {
642c349dbc7Sjsg #define MMIO_REG_HOLE_OFFSET (0x80000 - PAGE_SIZE)
643c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
644c349dbc7Sjsg
6451bb76ff1Sjsg if (!amdgpu_sriov_vf(adev)) {
646c349dbc7Sjsg adev->rmmio_remap.reg_offset = MMIO_REG_HOLE_OFFSET;
647c349dbc7Sjsg adev->rmmio_remap.bus_addr = adev->rmmio_base + MMIO_REG_HOLE_OFFSET;
6481bb76ff1Sjsg }
649c349dbc7Sjsg adev->smc_rreg = NULL;
650c349dbc7Sjsg adev->smc_wreg = NULL;
651*f005ef32Sjsg adev->pcie_rreg = &amdgpu_device_indirect_rreg;
652*f005ef32Sjsg adev->pcie_wreg = &amdgpu_device_indirect_wreg;
653*f005ef32Sjsg adev->pcie_rreg64 = &amdgpu_device_indirect_rreg64;
654*f005ef32Sjsg adev->pcie_wreg64 = &amdgpu_device_indirect_wreg64;
6551bb76ff1Sjsg adev->pciep_rreg = amdgpu_device_pcie_port_rreg;
6561bb76ff1Sjsg adev->pciep_wreg = amdgpu_device_pcie_port_wreg;
657c349dbc7Sjsg
658c349dbc7Sjsg /* TODO: will add them during VCN v2 implementation */
659c349dbc7Sjsg adev->uvd_ctx_rreg = NULL;
660c349dbc7Sjsg adev->uvd_ctx_wreg = NULL;
661c349dbc7Sjsg
662c349dbc7Sjsg adev->didt_rreg = &nv_didt_rreg;
663c349dbc7Sjsg adev->didt_wreg = &nv_didt_wreg;
664c349dbc7Sjsg
665c349dbc7Sjsg adev->asic_funcs = &nv_asic_funcs;
666c349dbc7Sjsg
667*f005ef32Sjsg adev->rev_id = amdgpu_device_get_rev_id(adev);
668c349dbc7Sjsg adev->external_rev_id = 0xff;
6691bb76ff1Sjsg /* TODO: split the GC and PG flags based on the relevant IP version for which
6701bb76ff1Sjsg * they are relevant.
6711bb76ff1Sjsg */
6721bb76ff1Sjsg switch (adev->ip_versions[GC_HWIP][0]) {
6731bb76ff1Sjsg case IP_VERSION(10, 1, 10):
674c349dbc7Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
675c349dbc7Sjsg AMD_CG_SUPPORT_GFX_CGCG |
676c349dbc7Sjsg AMD_CG_SUPPORT_IH_CG |
677c349dbc7Sjsg AMD_CG_SUPPORT_HDP_MGCG |
678c349dbc7Sjsg AMD_CG_SUPPORT_HDP_LS |
679c349dbc7Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
680c349dbc7Sjsg AMD_CG_SUPPORT_SDMA_LS |
681c349dbc7Sjsg AMD_CG_SUPPORT_MC_MGCG |
682c349dbc7Sjsg AMD_CG_SUPPORT_MC_LS |
683c349dbc7Sjsg AMD_CG_SUPPORT_ATHUB_MGCG |
684c349dbc7Sjsg AMD_CG_SUPPORT_ATHUB_LS |
685c349dbc7Sjsg AMD_CG_SUPPORT_VCN_MGCG |
686c349dbc7Sjsg AMD_CG_SUPPORT_JPEG_MGCG |
687c349dbc7Sjsg AMD_CG_SUPPORT_BIF_MGCG |
688c349dbc7Sjsg AMD_CG_SUPPORT_BIF_LS;
689c349dbc7Sjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
690c349dbc7Sjsg AMD_PG_SUPPORT_VCN_DPG |
691c349dbc7Sjsg AMD_PG_SUPPORT_JPEG |
692c349dbc7Sjsg AMD_PG_SUPPORT_ATHUB;
693c349dbc7Sjsg adev->external_rev_id = adev->rev_id + 0x1;
694c349dbc7Sjsg break;
6951bb76ff1Sjsg case IP_VERSION(10, 1, 1):
696c349dbc7Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
697c349dbc7Sjsg AMD_CG_SUPPORT_GFX_CGCG |
698c349dbc7Sjsg AMD_CG_SUPPORT_IH_CG |
699c349dbc7Sjsg AMD_CG_SUPPORT_HDP_MGCG |
700c349dbc7Sjsg AMD_CG_SUPPORT_HDP_LS |
701c349dbc7Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
702c349dbc7Sjsg AMD_CG_SUPPORT_SDMA_LS |
703c349dbc7Sjsg AMD_CG_SUPPORT_MC_MGCG |
704c349dbc7Sjsg AMD_CG_SUPPORT_MC_LS |
705c349dbc7Sjsg AMD_CG_SUPPORT_ATHUB_MGCG |
706c349dbc7Sjsg AMD_CG_SUPPORT_ATHUB_LS |
707c349dbc7Sjsg AMD_CG_SUPPORT_VCN_MGCG |
708c349dbc7Sjsg AMD_CG_SUPPORT_JPEG_MGCG |
709c349dbc7Sjsg AMD_CG_SUPPORT_BIF_MGCG |
710c349dbc7Sjsg AMD_CG_SUPPORT_BIF_LS;
711c349dbc7Sjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
712c349dbc7Sjsg AMD_PG_SUPPORT_JPEG |
713c349dbc7Sjsg AMD_PG_SUPPORT_VCN_DPG;
714c349dbc7Sjsg adev->external_rev_id = adev->rev_id + 20;
715c349dbc7Sjsg break;
7161bb76ff1Sjsg case IP_VERSION(10, 1, 2):
717c349dbc7Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
718c349dbc7Sjsg AMD_CG_SUPPORT_GFX_MGLS |
719c349dbc7Sjsg AMD_CG_SUPPORT_GFX_CGCG |
720c349dbc7Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
721c349dbc7Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
722c349dbc7Sjsg AMD_CG_SUPPORT_IH_CG |
723c349dbc7Sjsg AMD_CG_SUPPORT_HDP_MGCG |
724c349dbc7Sjsg AMD_CG_SUPPORT_HDP_LS |
725c349dbc7Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
726c349dbc7Sjsg AMD_CG_SUPPORT_SDMA_LS |
727c349dbc7Sjsg AMD_CG_SUPPORT_MC_MGCG |
728c349dbc7Sjsg AMD_CG_SUPPORT_MC_LS |
729c349dbc7Sjsg AMD_CG_SUPPORT_ATHUB_MGCG |
730c349dbc7Sjsg AMD_CG_SUPPORT_ATHUB_LS |
731c349dbc7Sjsg AMD_CG_SUPPORT_VCN_MGCG |
732c349dbc7Sjsg AMD_CG_SUPPORT_JPEG_MGCG;
733c349dbc7Sjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
734c349dbc7Sjsg AMD_PG_SUPPORT_VCN_DPG |
735c349dbc7Sjsg AMD_PG_SUPPORT_JPEG |
736c349dbc7Sjsg AMD_PG_SUPPORT_ATHUB;
737c349dbc7Sjsg /* guest vm gets 0xffffffff when reading RCC_DEV0_EPF0_STRAP0,
738c349dbc7Sjsg * as a consequence, the rev_id and external_rev_id are wrong.
739c349dbc7Sjsg * workaround it by hardcoding rev_id to 0 (default value).
740c349dbc7Sjsg */
741c349dbc7Sjsg if (amdgpu_sriov_vf(adev))
742c349dbc7Sjsg adev->rev_id = 0;
743c349dbc7Sjsg adev->external_rev_id = adev->rev_id + 0xa;
744c349dbc7Sjsg break;
7451bb76ff1Sjsg case IP_VERSION(10, 3, 0):
746ad8b1aafSjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
747ad8b1aafSjsg AMD_CG_SUPPORT_GFX_CGCG |
7485ca02815Sjsg AMD_CG_SUPPORT_GFX_CGLS |
749ad8b1aafSjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
750ad8b1aafSjsg AMD_CG_SUPPORT_MC_MGCG |
751ad8b1aafSjsg AMD_CG_SUPPORT_VCN_MGCG |
752ad8b1aafSjsg AMD_CG_SUPPORT_JPEG_MGCG |
753ad8b1aafSjsg AMD_CG_SUPPORT_HDP_MGCG |
754ad8b1aafSjsg AMD_CG_SUPPORT_HDP_LS |
755ad8b1aafSjsg AMD_CG_SUPPORT_IH_CG |
756ad8b1aafSjsg AMD_CG_SUPPORT_MC_LS;
757ad8b1aafSjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
758ad8b1aafSjsg AMD_PG_SUPPORT_VCN_DPG |
759ad8b1aafSjsg AMD_PG_SUPPORT_JPEG |
760ad8b1aafSjsg AMD_PG_SUPPORT_ATHUB |
761ad8b1aafSjsg AMD_PG_SUPPORT_MMHUB;
762ad8b1aafSjsg if (amdgpu_sriov_vf(adev)) {
763ad8b1aafSjsg /* hypervisor control CG and PG enablement */
764ad8b1aafSjsg adev->cg_flags = 0;
765ad8b1aafSjsg adev->pg_flags = 0;
766ad8b1aafSjsg }
767ad8b1aafSjsg adev->external_rev_id = adev->rev_id + 0x28;
768ad8b1aafSjsg break;
7691bb76ff1Sjsg case IP_VERSION(10, 3, 2):
770ad8b1aafSjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
771ad8b1aafSjsg AMD_CG_SUPPORT_GFX_CGCG |
7725ca02815Sjsg AMD_CG_SUPPORT_GFX_CGLS |
773ad8b1aafSjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
774ad8b1aafSjsg AMD_CG_SUPPORT_VCN_MGCG |
775ad8b1aafSjsg AMD_CG_SUPPORT_JPEG_MGCG |
776ad8b1aafSjsg AMD_CG_SUPPORT_MC_MGCG |
777ad8b1aafSjsg AMD_CG_SUPPORT_MC_LS |
778ad8b1aafSjsg AMD_CG_SUPPORT_HDP_MGCG |
779ad8b1aafSjsg AMD_CG_SUPPORT_HDP_LS |
780ad8b1aafSjsg AMD_CG_SUPPORT_IH_CG;
781ad8b1aafSjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
782ad8b1aafSjsg AMD_PG_SUPPORT_VCN_DPG |
783ad8b1aafSjsg AMD_PG_SUPPORT_JPEG |
784ad8b1aafSjsg AMD_PG_SUPPORT_ATHUB |
785ad8b1aafSjsg AMD_PG_SUPPORT_MMHUB;
786ad8b1aafSjsg adev->external_rev_id = adev->rev_id + 0x32;
787ad8b1aafSjsg break;
7881bb76ff1Sjsg case IP_VERSION(10, 3, 1):
7895ca02815Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
7905ca02815Sjsg AMD_CG_SUPPORT_GFX_MGLS |
7915ca02815Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
7925ca02815Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
7935ca02815Sjsg AMD_CG_SUPPORT_GFX_CGCG |
7945ca02815Sjsg AMD_CG_SUPPORT_GFX_CGLS |
7955ca02815Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
7965ca02815Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
7975ca02815Sjsg AMD_CG_SUPPORT_MC_MGCG |
7985ca02815Sjsg AMD_CG_SUPPORT_MC_LS |
7995ca02815Sjsg AMD_CG_SUPPORT_GFX_FGCG |
8005ca02815Sjsg AMD_CG_SUPPORT_VCN_MGCG |
8015ca02815Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
8025ca02815Sjsg AMD_CG_SUPPORT_SDMA_LS |
8035ca02815Sjsg AMD_CG_SUPPORT_JPEG_MGCG;
8045ca02815Sjsg adev->pg_flags = AMD_PG_SUPPORT_GFX_PG |
8055ca02815Sjsg AMD_PG_SUPPORT_VCN |
8065ca02815Sjsg AMD_PG_SUPPORT_VCN_DPG |
8075ca02815Sjsg AMD_PG_SUPPORT_JPEG;
8085ca02815Sjsg if (adev->apu_flags & AMD_APU_IS_VANGOGH)
8095ca02815Sjsg adev->external_rev_id = adev->rev_id + 0x01;
8105ca02815Sjsg break;
8111bb76ff1Sjsg case IP_VERSION(10, 3, 4):
8125ca02815Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
8135ca02815Sjsg AMD_CG_SUPPORT_GFX_CGCG |
8145ca02815Sjsg AMD_CG_SUPPORT_GFX_CGLS |
8155ca02815Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
8165ca02815Sjsg AMD_CG_SUPPORT_VCN_MGCG |
8175ca02815Sjsg AMD_CG_SUPPORT_JPEG_MGCG |
8185ca02815Sjsg AMD_CG_SUPPORT_MC_MGCG |
8195ca02815Sjsg AMD_CG_SUPPORT_MC_LS |
8205ca02815Sjsg AMD_CG_SUPPORT_HDP_MGCG |
8215ca02815Sjsg AMD_CG_SUPPORT_HDP_LS |
8225ca02815Sjsg AMD_CG_SUPPORT_IH_CG;
8235ca02815Sjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
8245ca02815Sjsg AMD_PG_SUPPORT_VCN_DPG |
8255ca02815Sjsg AMD_PG_SUPPORT_JPEG |
8265ca02815Sjsg AMD_PG_SUPPORT_ATHUB |
8275ca02815Sjsg AMD_PG_SUPPORT_MMHUB;
8285ca02815Sjsg adev->external_rev_id = adev->rev_id + 0x3c;
8295ca02815Sjsg break;
8301bb76ff1Sjsg case IP_VERSION(10, 3, 5):
8315ca02815Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
8325ca02815Sjsg AMD_CG_SUPPORT_GFX_CGCG |
8335ca02815Sjsg AMD_CG_SUPPORT_GFX_CGLS |
8345ca02815Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
8355ca02815Sjsg AMD_CG_SUPPORT_MC_MGCG |
8365ca02815Sjsg AMD_CG_SUPPORT_MC_LS |
8375ca02815Sjsg AMD_CG_SUPPORT_HDP_MGCG |
8385ca02815Sjsg AMD_CG_SUPPORT_HDP_LS |
8395ca02815Sjsg AMD_CG_SUPPORT_IH_CG |
8405ca02815Sjsg AMD_CG_SUPPORT_VCN_MGCG;
8415ca02815Sjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
8425ca02815Sjsg AMD_PG_SUPPORT_VCN_DPG |
8435ca02815Sjsg AMD_PG_SUPPORT_ATHUB |
8445ca02815Sjsg AMD_PG_SUPPORT_MMHUB;
8455ca02815Sjsg adev->external_rev_id = adev->rev_id + 0x46;
8465ca02815Sjsg break;
8471bb76ff1Sjsg case IP_VERSION(10, 3, 3):
8485ca02815Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
8495ca02815Sjsg AMD_CG_SUPPORT_GFX_MGLS |
8505ca02815Sjsg AMD_CG_SUPPORT_GFX_CGCG |
8515ca02815Sjsg AMD_CG_SUPPORT_GFX_CGLS |
8525ca02815Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
8535ca02815Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
8545ca02815Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
8555ca02815Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
8565ca02815Sjsg AMD_CG_SUPPORT_GFX_FGCG |
8575ca02815Sjsg AMD_CG_SUPPORT_MC_MGCG |
8585ca02815Sjsg AMD_CG_SUPPORT_MC_LS |
8595ca02815Sjsg AMD_CG_SUPPORT_SDMA_LS |
8605ca02815Sjsg AMD_CG_SUPPORT_HDP_MGCG |
8615ca02815Sjsg AMD_CG_SUPPORT_HDP_LS |
8625ca02815Sjsg AMD_CG_SUPPORT_ATHUB_MGCG |
8635ca02815Sjsg AMD_CG_SUPPORT_ATHUB_LS |
8645ca02815Sjsg AMD_CG_SUPPORT_IH_CG |
8655ca02815Sjsg AMD_CG_SUPPORT_VCN_MGCG |
866*f005ef32Sjsg AMD_CG_SUPPORT_JPEG_MGCG |
867*f005ef32Sjsg AMD_CG_SUPPORT_SDMA_MGCG;
8685ca02815Sjsg adev->pg_flags = AMD_PG_SUPPORT_GFX_PG |
8695ca02815Sjsg AMD_PG_SUPPORT_VCN |
8705ca02815Sjsg AMD_PG_SUPPORT_VCN_DPG |
8715ca02815Sjsg AMD_PG_SUPPORT_JPEG;
8725ca02815Sjsg if (adev->pdev->device == 0x1681)
8735ca02815Sjsg adev->external_rev_id = 0x20;
8745ca02815Sjsg else
8755ca02815Sjsg adev->external_rev_id = adev->rev_id + 0x01;
8765ca02815Sjsg break;
8771bb76ff1Sjsg case IP_VERSION(10, 1, 3):
8781bb76ff1Sjsg case IP_VERSION(10, 1, 4):
8795ca02815Sjsg adev->cg_flags = 0;
8805ca02815Sjsg adev->pg_flags = 0;
8815ca02815Sjsg adev->external_rev_id = adev->rev_id + 0x82;
8825ca02815Sjsg break;
8831bb76ff1Sjsg case IP_VERSION(10, 3, 6):
8841bb76ff1Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
8851bb76ff1Sjsg AMD_CG_SUPPORT_GFX_MGLS |
8861bb76ff1Sjsg AMD_CG_SUPPORT_GFX_CGCG |
8871bb76ff1Sjsg AMD_CG_SUPPORT_GFX_CGLS |
8881bb76ff1Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
8891bb76ff1Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
8901bb76ff1Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
8911bb76ff1Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
8921bb76ff1Sjsg AMD_CG_SUPPORT_GFX_FGCG |
8931bb76ff1Sjsg AMD_CG_SUPPORT_MC_MGCG |
8941bb76ff1Sjsg AMD_CG_SUPPORT_MC_LS |
8951bb76ff1Sjsg AMD_CG_SUPPORT_SDMA_LS |
8961bb76ff1Sjsg AMD_CG_SUPPORT_HDP_MGCG |
8971bb76ff1Sjsg AMD_CG_SUPPORT_HDP_LS |
8981bb76ff1Sjsg AMD_CG_SUPPORT_ATHUB_MGCG |
8991bb76ff1Sjsg AMD_CG_SUPPORT_ATHUB_LS |
9001bb76ff1Sjsg AMD_CG_SUPPORT_IH_CG |
9011bb76ff1Sjsg AMD_CG_SUPPORT_VCN_MGCG |
9021bb76ff1Sjsg AMD_CG_SUPPORT_JPEG_MGCG;
9031bb76ff1Sjsg adev->pg_flags = AMD_PG_SUPPORT_GFX_PG |
9041bb76ff1Sjsg AMD_PG_SUPPORT_VCN |
9051bb76ff1Sjsg AMD_PG_SUPPORT_VCN_DPG |
9061bb76ff1Sjsg AMD_PG_SUPPORT_JPEG;
9071bb76ff1Sjsg adev->external_rev_id = adev->rev_id + 0x01;
9081bb76ff1Sjsg break;
9091bb76ff1Sjsg case IP_VERSION(10, 3, 7):
9101bb76ff1Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
9111bb76ff1Sjsg AMD_CG_SUPPORT_GFX_MGLS |
9121bb76ff1Sjsg AMD_CG_SUPPORT_GFX_CGCG |
9131bb76ff1Sjsg AMD_CG_SUPPORT_GFX_CGLS |
9141bb76ff1Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
9151bb76ff1Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
9161bb76ff1Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
9171bb76ff1Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
9181bb76ff1Sjsg AMD_CG_SUPPORT_GFX_FGCG |
9191bb76ff1Sjsg AMD_CG_SUPPORT_MC_MGCG |
9201bb76ff1Sjsg AMD_CG_SUPPORT_MC_LS |
9211bb76ff1Sjsg AMD_CG_SUPPORT_SDMA_LS |
9221bb76ff1Sjsg AMD_CG_SUPPORT_HDP_MGCG |
9231bb76ff1Sjsg AMD_CG_SUPPORT_HDP_LS |
9241bb76ff1Sjsg AMD_CG_SUPPORT_ATHUB_MGCG |
9251bb76ff1Sjsg AMD_CG_SUPPORT_ATHUB_LS |
9261bb76ff1Sjsg AMD_CG_SUPPORT_IH_CG |
9271bb76ff1Sjsg AMD_CG_SUPPORT_VCN_MGCG |
928*f005ef32Sjsg AMD_CG_SUPPORT_JPEG_MGCG |
929*f005ef32Sjsg AMD_CG_SUPPORT_SDMA_MGCG;
9301bb76ff1Sjsg adev->pg_flags = AMD_PG_SUPPORT_VCN |
9311bb76ff1Sjsg AMD_PG_SUPPORT_VCN_DPG |
9321bb76ff1Sjsg AMD_PG_SUPPORT_JPEG |
9331bb76ff1Sjsg AMD_PG_SUPPORT_GFX_PG;
9341bb76ff1Sjsg adev->external_rev_id = adev->rev_id + 0x01;
9351bb76ff1Sjsg break;
936c349dbc7Sjsg default:
937c349dbc7Sjsg /* FIXME: not supported yet */
938c349dbc7Sjsg return -EINVAL;
939c349dbc7Sjsg }
940c349dbc7Sjsg
9415ca02815Sjsg if (adev->harvest_ip_mask & AMD_HARVEST_IP_VCN_MASK)
9425ca02815Sjsg adev->pg_flags &= ~(AMD_PG_SUPPORT_VCN |
9435ca02815Sjsg AMD_PG_SUPPORT_VCN_DPG |
9445ca02815Sjsg AMD_PG_SUPPORT_JPEG);
9455ca02815Sjsg
946c349dbc7Sjsg if (amdgpu_sriov_vf(adev)) {
947c349dbc7Sjsg amdgpu_virt_init_setting(adev);
948c349dbc7Sjsg xgpu_nv_mailbox_set_irq_funcs(adev);
949c349dbc7Sjsg }
950c349dbc7Sjsg
951c349dbc7Sjsg return 0;
952c349dbc7Sjsg }
953c349dbc7Sjsg
nv_common_late_init(void * handle)954c349dbc7Sjsg static int nv_common_late_init(void *handle)
955c349dbc7Sjsg {
956c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
957c349dbc7Sjsg
9585ca02815Sjsg if (amdgpu_sriov_vf(adev)) {
959c349dbc7Sjsg xgpu_nv_mailbox_get_irq(adev);
960*f005ef32Sjsg if (adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) {
9615ca02815Sjsg amdgpu_virt_update_sriov_video_codec(adev,
962*f005ef32Sjsg sriov_sc_video_codecs_encode_array,
963*f005ef32Sjsg ARRAY_SIZE(sriov_sc_video_codecs_encode_array),
964*f005ef32Sjsg sriov_sc_video_codecs_decode_array_vcn1,
965*f005ef32Sjsg ARRAY_SIZE(sriov_sc_video_codecs_decode_array_vcn1));
966*f005ef32Sjsg } else {
967*f005ef32Sjsg amdgpu_virt_update_sriov_video_codec(adev,
968*f005ef32Sjsg sriov_sc_video_codecs_encode_array,
969*f005ef32Sjsg ARRAY_SIZE(sriov_sc_video_codecs_encode_array),
970*f005ef32Sjsg sriov_sc_video_codecs_decode_array_vcn0,
971*f005ef32Sjsg ARRAY_SIZE(sriov_sc_video_codecs_decode_array_vcn0));
9725ca02815Sjsg }
973*f005ef32Sjsg }
974*f005ef32Sjsg
975*f005ef32Sjsg /* Enable selfring doorbell aperture late because doorbell BAR
976*f005ef32Sjsg * aperture will change if resize BAR successfully in gmc sw_init.
977*f005ef32Sjsg */
978*f005ef32Sjsg adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
979c349dbc7Sjsg
980c349dbc7Sjsg return 0;
981c349dbc7Sjsg }
982c349dbc7Sjsg
nv_common_sw_init(void * handle)983c349dbc7Sjsg static int nv_common_sw_init(void *handle)
984c349dbc7Sjsg {
985c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
986c349dbc7Sjsg
987c349dbc7Sjsg if (amdgpu_sriov_vf(adev))
988c349dbc7Sjsg xgpu_nv_mailbox_add_irq_id(adev);
989c349dbc7Sjsg
990c349dbc7Sjsg return 0;
991c349dbc7Sjsg }
992c349dbc7Sjsg
nv_common_sw_fini(void * handle)993c349dbc7Sjsg static int nv_common_sw_fini(void *handle)
994c349dbc7Sjsg {
995c349dbc7Sjsg return 0;
996c349dbc7Sjsg }
997c349dbc7Sjsg
nv_common_hw_init(void * handle)998c349dbc7Sjsg static int nv_common_hw_init(void *handle)
999c349dbc7Sjsg {
1000c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1001c349dbc7Sjsg
10025ca02815Sjsg if (adev->nbio.funcs->apply_lc_spc_mode_wa)
10035ca02815Sjsg adev->nbio.funcs->apply_lc_spc_mode_wa(adev);
10045ca02815Sjsg
10055ca02815Sjsg if (adev->nbio.funcs->apply_l1_link_width_reconfig_wa)
10065ca02815Sjsg adev->nbio.funcs->apply_l1_link_width_reconfig_wa(adev);
10075ca02815Sjsg
1008c349dbc7Sjsg /* enable aspm */
1009c349dbc7Sjsg nv_program_aspm(adev);
1010c349dbc7Sjsg /* setup nbio registers */
1011c349dbc7Sjsg adev->nbio.funcs->init_registers(adev);
1012c349dbc7Sjsg /* remap HDP registers to a hole in mmio space,
1013c349dbc7Sjsg * for the purpose of expose those registers
1014c349dbc7Sjsg * to process space
1015c349dbc7Sjsg */
10161bb76ff1Sjsg if (adev->nbio.funcs->remap_hdp_registers && !amdgpu_sriov_vf(adev))
1017c349dbc7Sjsg adev->nbio.funcs->remap_hdp_registers(adev);
1018c349dbc7Sjsg /* enable the doorbell aperture */
1019*f005ef32Sjsg adev->nbio.funcs->enable_doorbell_aperture(adev, true);
1020c349dbc7Sjsg
1021c349dbc7Sjsg return 0;
1022c349dbc7Sjsg }
1023c349dbc7Sjsg
nv_common_hw_fini(void * handle)1024c349dbc7Sjsg static int nv_common_hw_fini(void *handle)
1025c349dbc7Sjsg {
1026c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1027c349dbc7Sjsg
1028*f005ef32Sjsg /* Disable the doorbell aperture and selfring doorbell aperture
1029*f005ef32Sjsg * separately in hw_fini because nv_enable_doorbell_aperture
1030*f005ef32Sjsg * has been removed and there is no need to delay disabling
1031*f005ef32Sjsg * selfring doorbell.
1032*f005ef32Sjsg */
1033*f005ef32Sjsg adev->nbio.funcs->enable_doorbell_aperture(adev, false);
1034*f005ef32Sjsg adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
1035c349dbc7Sjsg
1036c349dbc7Sjsg return 0;
1037c349dbc7Sjsg }
1038c349dbc7Sjsg
nv_common_suspend(void * handle)1039c349dbc7Sjsg static int nv_common_suspend(void *handle)
1040c349dbc7Sjsg {
1041c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1042c349dbc7Sjsg
1043c349dbc7Sjsg return nv_common_hw_fini(adev);
1044c349dbc7Sjsg }
1045c349dbc7Sjsg
nv_common_resume(void * handle)1046c349dbc7Sjsg static int nv_common_resume(void *handle)
1047c349dbc7Sjsg {
1048c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1049c349dbc7Sjsg
1050c349dbc7Sjsg return nv_common_hw_init(adev);
1051c349dbc7Sjsg }
1052c349dbc7Sjsg
nv_common_is_idle(void * handle)1053c349dbc7Sjsg static bool nv_common_is_idle(void *handle)
1054c349dbc7Sjsg {
1055c349dbc7Sjsg return true;
1056c349dbc7Sjsg }
1057c349dbc7Sjsg
nv_common_wait_for_idle(void * handle)1058c349dbc7Sjsg static int nv_common_wait_for_idle(void *handle)
1059c349dbc7Sjsg {
1060c349dbc7Sjsg return 0;
1061c349dbc7Sjsg }
1062c349dbc7Sjsg
nv_common_soft_reset(void * handle)1063c349dbc7Sjsg static int nv_common_soft_reset(void *handle)
1064c349dbc7Sjsg {
1065c349dbc7Sjsg return 0;
1066c349dbc7Sjsg }
1067c349dbc7Sjsg
nv_common_set_clockgating_state(void * handle,enum amd_clockgating_state state)1068c349dbc7Sjsg static int nv_common_set_clockgating_state(void *handle,
1069c349dbc7Sjsg enum amd_clockgating_state state)
1070c349dbc7Sjsg {
1071c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1072c349dbc7Sjsg
1073c349dbc7Sjsg if (amdgpu_sriov_vf(adev))
1074c349dbc7Sjsg return 0;
1075c349dbc7Sjsg
10761bb76ff1Sjsg switch (adev->ip_versions[NBIO_HWIP][0]) {
10771bb76ff1Sjsg case IP_VERSION(2, 3, 0):
10781bb76ff1Sjsg case IP_VERSION(2, 3, 1):
10791bb76ff1Sjsg case IP_VERSION(2, 3, 2):
10801bb76ff1Sjsg case IP_VERSION(3, 3, 0):
10811bb76ff1Sjsg case IP_VERSION(3, 3, 1):
10821bb76ff1Sjsg case IP_VERSION(3, 3, 2):
10831bb76ff1Sjsg case IP_VERSION(3, 3, 3):
1084c349dbc7Sjsg adev->nbio.funcs->update_medium_grain_clock_gating(adev,
1085c349dbc7Sjsg state == AMD_CG_STATE_GATE);
1086c349dbc7Sjsg adev->nbio.funcs->update_medium_grain_light_sleep(adev,
1087c349dbc7Sjsg state == AMD_CG_STATE_GATE);
10885ca02815Sjsg adev->hdp.funcs->update_clock_gating(adev,
1089c349dbc7Sjsg state == AMD_CG_STATE_GATE);
10905ca02815Sjsg adev->smuio.funcs->update_rom_clock_gating(adev,
1091c349dbc7Sjsg state == AMD_CG_STATE_GATE);
1092c349dbc7Sjsg break;
1093c349dbc7Sjsg default:
1094c349dbc7Sjsg break;
1095c349dbc7Sjsg }
1096c349dbc7Sjsg return 0;
1097c349dbc7Sjsg }
1098c349dbc7Sjsg
nv_common_set_powergating_state(void * handle,enum amd_powergating_state state)1099c349dbc7Sjsg static int nv_common_set_powergating_state(void *handle,
1100c349dbc7Sjsg enum amd_powergating_state state)
1101c349dbc7Sjsg {
1102c349dbc7Sjsg /* TODO */
1103c349dbc7Sjsg return 0;
1104c349dbc7Sjsg }
1105c349dbc7Sjsg
nv_common_get_clockgating_state(void * handle,u64 * flags)11061bb76ff1Sjsg static void nv_common_get_clockgating_state(void *handle, u64 *flags)
1107c349dbc7Sjsg {
1108c349dbc7Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1109c349dbc7Sjsg
1110c349dbc7Sjsg if (amdgpu_sriov_vf(adev))
1111c349dbc7Sjsg *flags = 0;
1112c349dbc7Sjsg
1113c349dbc7Sjsg adev->nbio.funcs->get_clockgating_state(adev, flags);
1114c349dbc7Sjsg
11155ca02815Sjsg adev->hdp.funcs->get_clock_gating_state(adev, flags);
1116c349dbc7Sjsg
11175ca02815Sjsg adev->smuio.funcs->get_clock_gating_state(adev, flags);
1118c349dbc7Sjsg
1119c349dbc7Sjsg return;
1120c349dbc7Sjsg }
1121c349dbc7Sjsg
1122c349dbc7Sjsg static const struct amd_ip_funcs nv_common_ip_funcs = {
1123c349dbc7Sjsg .name = "nv_common",
1124c349dbc7Sjsg .early_init = nv_common_early_init,
1125c349dbc7Sjsg .late_init = nv_common_late_init,
1126c349dbc7Sjsg .sw_init = nv_common_sw_init,
1127c349dbc7Sjsg .sw_fini = nv_common_sw_fini,
1128c349dbc7Sjsg .hw_init = nv_common_hw_init,
1129c349dbc7Sjsg .hw_fini = nv_common_hw_fini,
1130c349dbc7Sjsg .suspend = nv_common_suspend,
1131c349dbc7Sjsg .resume = nv_common_resume,
1132c349dbc7Sjsg .is_idle = nv_common_is_idle,
1133c349dbc7Sjsg .wait_for_idle = nv_common_wait_for_idle,
1134c349dbc7Sjsg .soft_reset = nv_common_soft_reset,
1135c349dbc7Sjsg .set_clockgating_state = nv_common_set_clockgating_state,
1136c349dbc7Sjsg .set_powergating_state = nv_common_set_powergating_state,
1137c349dbc7Sjsg .get_clockgating_state = nv_common_get_clockgating_state,
1138c349dbc7Sjsg };
1139