Linux Audio

Check our new training course

Loading...
v6.9.4
  1/*
  2 * Copyright 2015 Advanced Micro Devices, Inc.
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice shall be included in
 12 * all copies or substantial portions of the Software.
 13 *
 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 20 * OTHER DEALINGS IN THE SOFTWARE.
 21 *
 22 *
 23 */
 24#include <linux/list.h>
 25#include <linux/pci.h>
 26#include <linux/slab.h>
 27
 
 28#include <linux/firmware.h>
 29#include <drm/amdgpu_drm.h>
 30#include "amdgpu.h"
 31#include "atom.h"
 32#include "amdgpu_ucode.h"
 33
 34struct amdgpu_cgs_device {
 35	struct cgs_device base;
 36	struct amdgpu_device *adev;
 37};
 38
 39#define CGS_FUNC_ADEV							\
 40	struct amdgpu_device *adev =					\
 41		((struct amdgpu_cgs_device *)cgs_device)->adev
 42
 43
 44static uint32_t amdgpu_cgs_read_register(struct cgs_device *cgs_device, unsigned int offset)
 45{
 46	CGS_FUNC_ADEV;
 47	return RREG32(offset);
 48}
 49
 50static void amdgpu_cgs_write_register(struct cgs_device *cgs_device, unsigned int offset,
 51				      uint32_t value)
 52{
 53	CGS_FUNC_ADEV;
 54	WREG32(offset, value);
 55}
 56
 57static uint32_t amdgpu_cgs_read_ind_register(struct cgs_device *cgs_device,
 58					     enum cgs_ind_reg space,
 59					     unsigned int index)
 60{
 61	CGS_FUNC_ADEV;
 62	switch (space) {
 
 
 63	case CGS_IND_REG__PCIE:
 64		return RREG32_PCIE(index);
 65	case CGS_IND_REG__SMC:
 66		return RREG32_SMC(index);
 67	case CGS_IND_REG__UVD_CTX:
 68		return RREG32_UVD_CTX(index);
 69	case CGS_IND_REG__DIDT:
 70		return RREG32_DIDT(index);
 71	case CGS_IND_REG_GC_CAC:
 72		return RREG32_GC_CAC(index);
 73	case CGS_IND_REG_SE_CAC:
 74		return RREG32_SE_CAC(index);
 75	case CGS_IND_REG__AUDIO_ENDPT:
 76		DRM_ERROR("audio endpt register access not implemented.\n");
 77		return 0;
 78	default:
 79		BUG();
 80	}
 81	WARN(1, "Invalid indirect register space");
 82	return 0;
 83}
 84
 85static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device,
 86					  enum cgs_ind_reg space,
 87					  unsigned int index, uint32_t value)
 88{
 89	CGS_FUNC_ADEV;
 90	switch (space) {
 
 
 91	case CGS_IND_REG__PCIE:
 92		return WREG32_PCIE(index, value);
 93	case CGS_IND_REG__SMC:
 94		return WREG32_SMC(index, value);
 95	case CGS_IND_REG__UVD_CTX:
 96		return WREG32_UVD_CTX(index, value);
 97	case CGS_IND_REG__DIDT:
 98		return WREG32_DIDT(index, value);
 99	case CGS_IND_REG_GC_CAC:
100		return WREG32_GC_CAC(index, value);
101	case CGS_IND_REG_SE_CAC:
102		return WREG32_SE_CAC(index, value);
103	case CGS_IND_REG__AUDIO_ENDPT:
104		DRM_ERROR("audio endpt register access not implemented.\n");
105		return;
106	default:
107		BUG();
108	}
109	WARN(1, "Invalid indirect register space");
110}
111
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112static uint32_t fw_type_convert(struct cgs_device *cgs_device, uint32_t fw_type)
113{
114	CGS_FUNC_ADEV;
115	enum AMDGPU_UCODE_ID result = AMDGPU_UCODE_ID_MAXIMUM;
116
117	switch (fw_type) {
118	case CGS_UCODE_ID_SDMA0:
119		result = AMDGPU_UCODE_ID_SDMA0;
120		break;
121	case CGS_UCODE_ID_SDMA1:
122		result = AMDGPU_UCODE_ID_SDMA1;
123		break;
124	case CGS_UCODE_ID_CP_CE:
125		result = AMDGPU_UCODE_ID_CP_CE;
126		break;
127	case CGS_UCODE_ID_CP_PFP:
128		result = AMDGPU_UCODE_ID_CP_PFP;
129		break;
130	case CGS_UCODE_ID_CP_ME:
131		result = AMDGPU_UCODE_ID_CP_ME;
132		break;
133	case CGS_UCODE_ID_CP_MEC:
134	case CGS_UCODE_ID_CP_MEC_JT1:
135		result = AMDGPU_UCODE_ID_CP_MEC1;
136		break;
137	case CGS_UCODE_ID_CP_MEC_JT2:
138		/* for VI. JT2 should be the same as JT1, because:
139			1, MEC2 and MEC1 use exactly same FW.
140			2, JT2 is not pached but JT1 is.
141		*/
142		if (adev->asic_type >= CHIP_TOPAZ)
143			result = AMDGPU_UCODE_ID_CP_MEC1;
144		else
145			result = AMDGPU_UCODE_ID_CP_MEC2;
146		break;
147	case CGS_UCODE_ID_RLC_G:
148		result = AMDGPU_UCODE_ID_RLC_G;
149		break;
150	case CGS_UCODE_ID_STORAGE:
151		result = AMDGPU_UCODE_ID_STORAGE;
152		break;
153	default:
154		DRM_ERROR("Firmware type not supported\n");
155	}
156	return result;
157}
158
 
 
 
 
 
 
 
 
 
 
 
 
159static uint16_t amdgpu_get_firmware_version(struct cgs_device *cgs_device,
160					enum cgs_ucode_id type)
161{
162	CGS_FUNC_ADEV;
163	uint16_t fw_version = 0;
164
165	switch (type) {
166	case CGS_UCODE_ID_SDMA0:
167		fw_version = adev->sdma.instance[0].fw_version;
168		break;
169	case CGS_UCODE_ID_SDMA1:
170		fw_version = adev->sdma.instance[1].fw_version;
171		break;
172	case CGS_UCODE_ID_CP_CE:
173		fw_version = adev->gfx.ce_fw_version;
174		break;
175	case CGS_UCODE_ID_CP_PFP:
176		fw_version = adev->gfx.pfp_fw_version;
177		break;
178	case CGS_UCODE_ID_CP_ME:
179		fw_version = adev->gfx.me_fw_version;
180		break;
181	case CGS_UCODE_ID_CP_MEC:
182		fw_version = adev->gfx.mec_fw_version;
183		break;
184	case CGS_UCODE_ID_CP_MEC_JT1:
185		fw_version = adev->gfx.mec_fw_version;
186		break;
187	case CGS_UCODE_ID_CP_MEC_JT2:
188		fw_version = adev->gfx.mec_fw_version;
189		break;
190	case CGS_UCODE_ID_RLC_G:
191		fw_version = adev->gfx.rlc_fw_version;
192		break;
193	case CGS_UCODE_ID_STORAGE:
194		break;
195	default:
196		DRM_ERROR("firmware type %d do not have version\n", type);
197		break;
198	}
199	return fw_version;
200}
201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
203					enum cgs_ucode_id type,
204					struct cgs_firmware_info *info)
205{
206	CGS_FUNC_ADEV;
207
208	if (type != CGS_UCODE_ID_SMU && type != CGS_UCODE_ID_SMU_SK) {
209		uint64_t gpu_addr;
210		uint32_t data_size;
211		const struct gfx_firmware_header_v1_0 *header;
212		enum AMDGPU_UCODE_ID id;
213		struct amdgpu_firmware_info *ucode;
214
215		id = fw_type_convert(cgs_device, type);
216		ucode = &adev->firmware.ucode[id];
217		if (ucode->fw == NULL)
218			return -EINVAL;
219
220		gpu_addr  = ucode->mc_addr;
221		header = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data;
222		data_size = le32_to_cpu(header->header.ucode_size_bytes);
223
224		if ((type == CGS_UCODE_ID_CP_MEC_JT1) ||
225		    (type == CGS_UCODE_ID_CP_MEC_JT2)) {
226			gpu_addr += ALIGN(le32_to_cpu(header->header.ucode_size_bytes), PAGE_SIZE);
227			data_size = le32_to_cpu(header->jt_size) << 2;
228		}
229
230		info->kptr = ucode->kaddr;
231		info->image_size = data_size;
232		info->mc_addr = gpu_addr;
233		info->version = (uint16_t)le32_to_cpu(header->header.ucode_version);
234
235		if (type == CGS_UCODE_ID_CP_MEC)
236			info->image_size = le32_to_cpu(header->jt_offset) << 2;
237
238		info->fw_version = amdgpu_get_firmware_version(cgs_device, type);
239		info->feature_version = (uint16_t)le32_to_cpu(header->ucode_feature_version);
240	} else {
241		char fw_name[30] = {0};
242		int err = 0;
243		uint32_t ucode_size;
244		uint32_t ucode_start_address;
245		const uint8_t *src;
246		const struct smc_firmware_header_v1_0 *hdr;
247		const struct common_firmware_header *header;
248		struct amdgpu_firmware_info *ucode = NULL;
249
250		if (!adev->pm.fw) {
251			switch (adev->asic_type) {
252			case CHIP_TAHITI:
253				strcpy(fw_name, "radeon/tahiti_smc.bin");
254				break;
255			case CHIP_PITCAIRN:
256				if ((adev->pdev->revision == 0x81) &&
257				    ((adev->pdev->device == 0x6810) ||
258				    (adev->pdev->device == 0x6811))) {
259					info->is_kicker = true;
260					strcpy(fw_name, "radeon/pitcairn_k_smc.bin");
261				} else {
262					strcpy(fw_name, "radeon/pitcairn_smc.bin");
263				}
264				break;
265			case CHIP_VERDE:
266				if (((adev->pdev->device == 0x6820) &&
267					((adev->pdev->revision == 0x81) ||
268					(adev->pdev->revision == 0x83))) ||
269				    ((adev->pdev->device == 0x6821) &&
270					((adev->pdev->revision == 0x83) ||
271					(adev->pdev->revision == 0x87))) ||
272				    ((adev->pdev->revision == 0x87) &&
273					((adev->pdev->device == 0x6823) ||
274					(adev->pdev->device == 0x682b)))) {
275					info->is_kicker = true;
276					strcpy(fw_name, "radeon/verde_k_smc.bin");
277				} else {
278					strcpy(fw_name, "radeon/verde_smc.bin");
279				}
280				break;
281			case CHIP_OLAND:
282				if (((adev->pdev->revision == 0x81) &&
283					((adev->pdev->device == 0x6600) ||
284					(adev->pdev->device == 0x6604) ||
285					(adev->pdev->device == 0x6605) ||
286					(adev->pdev->device == 0x6610))) ||
287				    ((adev->pdev->revision == 0x83) &&
288					(adev->pdev->device == 0x6610))) {
289					info->is_kicker = true;
290					strcpy(fw_name, "radeon/oland_k_smc.bin");
291				} else {
292					strcpy(fw_name, "radeon/oland_smc.bin");
293				}
294				break;
295			case CHIP_HAINAN:
296				if (((adev->pdev->revision == 0x81) &&
297					(adev->pdev->device == 0x6660)) ||
298				    ((adev->pdev->revision == 0x83) &&
299					((adev->pdev->device == 0x6660) ||
300					(adev->pdev->device == 0x6663) ||
301					(adev->pdev->device == 0x6665) ||
302					 (adev->pdev->device == 0x6667)))) {
303					info->is_kicker = true;
304					strcpy(fw_name, "radeon/hainan_k_smc.bin");
305				} else if ((adev->pdev->revision == 0xc3) &&
306					 (adev->pdev->device == 0x6665)) {
307					info->is_kicker = true;
308					strcpy(fw_name, "radeon/banks_k_2_smc.bin");
309				} else {
310					strcpy(fw_name, "radeon/hainan_smc.bin");
311				}
312				break;
313			case CHIP_BONAIRE:
314				if ((adev->pdev->revision == 0x80) ||
315					(adev->pdev->revision == 0x81) ||
316					(adev->pdev->device == 0x665f)) {
317					info->is_kicker = true;
318					strcpy(fw_name, "amdgpu/bonaire_k_smc.bin");
319				} else {
320					strcpy(fw_name, "amdgpu/bonaire_smc.bin");
321				}
322				break;
323			case CHIP_HAWAII:
324				if (adev->pdev->revision == 0x80) {
325					info->is_kicker = true;
326					strcpy(fw_name, "amdgpu/hawaii_k_smc.bin");
327				} else {
328					strcpy(fw_name, "amdgpu/hawaii_smc.bin");
329				}
330				break;
331			case CHIP_TOPAZ:
332				if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) ||
333				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) ||
334				    ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87)) ||
335				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD1)) ||
336				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD3))) {
337					info->is_kicker = true;
338					strcpy(fw_name, "amdgpu/topaz_k_smc.bin");
339				} else
340					strcpy(fw_name, "amdgpu/topaz_smc.bin");
341				break;
342			case CHIP_TONGA:
343				if (((adev->pdev->device == 0x6939) && (adev->pdev->revision == 0xf1)) ||
344				    ((adev->pdev->device == 0x6938) && (adev->pdev->revision == 0xf1))) {
345					info->is_kicker = true;
346					strcpy(fw_name, "amdgpu/tonga_k_smc.bin");
347				} else
348					strcpy(fw_name, "amdgpu/tonga_smc.bin");
349				break;
350			case CHIP_FIJI:
351				strcpy(fw_name, "amdgpu/fiji_smc.bin");
352				break;
353			case CHIP_POLARIS11:
354				if (type == CGS_UCODE_ID_SMU) {
355					if (ASICID_IS_P21(adev->pdev->device, adev->pdev->revision)) {
 
 
 
 
 
 
 
356						info->is_kicker = true;
357						strcpy(fw_name, "amdgpu/polaris11_k_smc.bin");
358					} else if (ASICID_IS_P31(adev->pdev->device, adev->pdev->revision)) {
359						info->is_kicker = true;
360						strcpy(fw_name, "amdgpu/polaris11_k2_smc.bin");
361					} else {
362						strcpy(fw_name, "amdgpu/polaris11_smc.bin");
363					}
364				} else if (type == CGS_UCODE_ID_SMU_SK) {
365					strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin");
366				}
367				break;
368			case CHIP_POLARIS10:
369				if (type == CGS_UCODE_ID_SMU) {
370					if (ASICID_IS_P20(adev->pdev->device, adev->pdev->revision)) {
 
 
 
 
 
 
371						info->is_kicker = true;
372						strcpy(fw_name, "amdgpu/polaris10_k_smc.bin");
373					} else if (ASICID_IS_P30(adev->pdev->device, adev->pdev->revision)) {
374						info->is_kicker = true;
375						strcpy(fw_name, "amdgpu/polaris10_k2_smc.bin");
376					} else {
377						strcpy(fw_name, "amdgpu/polaris10_smc.bin");
378					}
379				} else if (type == CGS_UCODE_ID_SMU_SK) {
380					strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin");
381				}
382				break;
383			case CHIP_POLARIS12:
384				if (ASICID_IS_P23(adev->pdev->device, adev->pdev->revision)) {
385					info->is_kicker = true;
386					strcpy(fw_name, "amdgpu/polaris12_k_smc.bin");
387				} else {
388					strcpy(fw_name, "amdgpu/polaris12_smc.bin");
389				}
390				break;
391			case CHIP_VEGAM:
392				strcpy(fw_name, "amdgpu/vegam_smc.bin");
393				break;
394			case CHIP_VEGA10:
395				if ((adev->pdev->device == 0x687f) &&
396					((adev->pdev->revision == 0xc0) ||
397					(adev->pdev->revision == 0xc1) ||
398					(adev->pdev->revision == 0xc3)))
399					strcpy(fw_name, "amdgpu/vega10_acg_smc.bin");
400				else
401					strcpy(fw_name, "amdgpu/vega10_smc.bin");
402				break;
403			case CHIP_VEGA12:
404				strcpy(fw_name, "amdgpu/vega12_smc.bin");
405				break;
406			case CHIP_VEGA20:
407				strcpy(fw_name, "amdgpu/vega20_smc.bin");
408				break;
409			default:
410				DRM_ERROR("SMC firmware not supported\n");
411				return -EINVAL;
412			}
413
414			err = amdgpu_ucode_request(adev, &adev->pm.fw, fw_name);
 
 
 
 
 
 
415			if (err) {
416				DRM_ERROR("Failed to load firmware \"%s\"", fw_name);
417				amdgpu_ucode_release(&adev->pm.fw);
 
418				return err;
419			}
420
421			if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
422				ucode = &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC];
423				ucode->ucode_id = AMDGPU_UCODE_ID_SMC;
424				ucode->fw = adev->pm.fw;
425				header = (const struct common_firmware_header *)ucode->fw->data;
426				adev->firmware.fw_size +=
427					ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
428			}
429		}
430
431		hdr = (const struct smc_firmware_header_v1_0 *)	adev->pm.fw->data;
432		amdgpu_ucode_print_smc_hdr(&hdr->header);
433		adev->pm.fw_version = le32_to_cpu(hdr->header.ucode_version);
434		ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
435		ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
436		src = (const uint8_t *)(adev->pm.fw->data +
437		       le32_to_cpu(hdr->header.ucode_array_offset_bytes));
438
439		info->version = adev->pm.fw_version;
440		info->image_size = ucode_size;
441		info->ucode_start_address = ucode_start_address;
442		info->kptr = (void *)src;
443	}
444	return 0;
445}
446
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
447static const struct cgs_ops amdgpu_cgs_ops = {
448	.read_register = amdgpu_cgs_read_register,
449	.write_register = amdgpu_cgs_write_register,
450	.read_ind_register = amdgpu_cgs_read_ind_register,
451	.write_ind_register = amdgpu_cgs_write_ind_register,
 
 
 
 
452	.get_firmware_info = amdgpu_cgs_get_firmware_info,
 
 
 
 
 
 
 
 
453};
454
455struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev)
456{
457	struct amdgpu_cgs_device *cgs_device =
458		kmalloc(sizeof(*cgs_device), GFP_KERNEL);
459
460	if (!cgs_device) {
461		DRM_ERROR("Couldn't allocate CGS device structure\n");
462		return NULL;
463	}
464
465	cgs_device->base.ops = &amdgpu_cgs_ops;
466	cgs_device->adev = adev;
467
468	return (struct cgs_device *)cgs_device;
469}
470
471void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device)
472{
473	kfree(cgs_device);
474}
v4.17
  1/*
  2 * Copyright 2015 Advanced Micro Devices, Inc.
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice shall be included in
 12 * all copies or substantial portions of the Software.
 13 *
 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 20 * OTHER DEALINGS IN THE SOFTWARE.
 21 *
 22 *
 23 */
 24#include <linux/list.h>
 
 25#include <linux/slab.h>
 26#include <linux/pci.h>
 27#include <drm/drmP.h>
 28#include <linux/firmware.h>
 29#include <drm/amdgpu_drm.h>
 30#include "amdgpu.h"
 31#include "atom.h"
 32#include "amdgpu_ucode.h"
 33
 34struct amdgpu_cgs_device {
 35	struct cgs_device base;
 36	struct amdgpu_device *adev;
 37};
 38
 39#define CGS_FUNC_ADEV							\
 40	struct amdgpu_device *adev =					\
 41		((struct amdgpu_cgs_device *)cgs_device)->adev
 42
 43
 44static uint32_t amdgpu_cgs_read_register(struct cgs_device *cgs_device, unsigned offset)
 45{
 46	CGS_FUNC_ADEV;
 47	return RREG32(offset);
 48}
 49
 50static void amdgpu_cgs_write_register(struct cgs_device *cgs_device, unsigned offset,
 51				      uint32_t value)
 52{
 53	CGS_FUNC_ADEV;
 54	WREG32(offset, value);
 55}
 56
 57static uint32_t amdgpu_cgs_read_ind_register(struct cgs_device *cgs_device,
 58					     enum cgs_ind_reg space,
 59					     unsigned index)
 60{
 61	CGS_FUNC_ADEV;
 62	switch (space) {
 63	case CGS_IND_REG__MMIO:
 64		return RREG32_IDX(index);
 65	case CGS_IND_REG__PCIE:
 66		return RREG32_PCIE(index);
 67	case CGS_IND_REG__SMC:
 68		return RREG32_SMC(index);
 69	case CGS_IND_REG__UVD_CTX:
 70		return RREG32_UVD_CTX(index);
 71	case CGS_IND_REG__DIDT:
 72		return RREG32_DIDT(index);
 73	case CGS_IND_REG_GC_CAC:
 74		return RREG32_GC_CAC(index);
 75	case CGS_IND_REG_SE_CAC:
 76		return RREG32_SE_CAC(index);
 77	case CGS_IND_REG__AUDIO_ENDPT:
 78		DRM_ERROR("audio endpt register access not implemented.\n");
 79		return 0;
 
 
 80	}
 81	WARN(1, "Invalid indirect register space");
 82	return 0;
 83}
 84
 85static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device,
 86					  enum cgs_ind_reg space,
 87					  unsigned index, uint32_t value)
 88{
 89	CGS_FUNC_ADEV;
 90	switch (space) {
 91	case CGS_IND_REG__MMIO:
 92		return WREG32_IDX(index, value);
 93	case CGS_IND_REG__PCIE:
 94		return WREG32_PCIE(index, value);
 95	case CGS_IND_REG__SMC:
 96		return WREG32_SMC(index, value);
 97	case CGS_IND_REG__UVD_CTX:
 98		return WREG32_UVD_CTX(index, value);
 99	case CGS_IND_REG__DIDT:
100		return WREG32_DIDT(index, value);
101	case CGS_IND_REG_GC_CAC:
102		return WREG32_GC_CAC(index, value);
103	case CGS_IND_REG_SE_CAC:
104		return WREG32_SE_CAC(index, value);
105	case CGS_IND_REG__AUDIO_ENDPT:
106		DRM_ERROR("audio endpt register access not implemented.\n");
107		return;
 
 
108	}
109	WARN(1, "Invalid indirect register space");
110}
111
112static int amdgpu_cgs_get_pci_resource(struct cgs_device *cgs_device,
113				       enum cgs_resource_type resource_type,
114				       uint64_t size,
115				       uint64_t offset,
116				       uint64_t *resource_base)
117{
118	CGS_FUNC_ADEV;
119
120	if (resource_base == NULL)
121		return -EINVAL;
122
123	switch (resource_type) {
124	case CGS_RESOURCE_TYPE_MMIO:
125		if (adev->rmmio_size == 0)
126			return -ENOENT;
127		if ((offset + size) > adev->rmmio_size)
128			return -EINVAL;
129		*resource_base = adev->rmmio_base;
130		return 0;
131	case CGS_RESOURCE_TYPE_DOORBELL:
132		if (adev->doorbell.size == 0)
133			return -ENOENT;
134		if ((offset + size) > adev->doorbell.size)
135			return -EINVAL;
136		*resource_base = adev->doorbell.base;
137		return 0;
138	case CGS_RESOURCE_TYPE_FB:
139	case CGS_RESOURCE_TYPE_IO:
140	case CGS_RESOURCE_TYPE_ROM:
141	default:
142		return -EINVAL;
143	}
144}
145
146static const void *amdgpu_cgs_atom_get_data_table(struct cgs_device *cgs_device,
147						  unsigned table, uint16_t *size,
148						  uint8_t *frev, uint8_t *crev)
149{
150	CGS_FUNC_ADEV;
151	uint16_t data_start;
152
153	if (amdgpu_atom_parse_data_header(
154		    adev->mode_info.atom_context, table, size,
155		    frev, crev, &data_start))
156		return (uint8_t*)adev->mode_info.atom_context->bios +
157			data_start;
158
159	return NULL;
160}
161
162static int amdgpu_cgs_atom_get_cmd_table_revs(struct cgs_device *cgs_device, unsigned table,
163					      uint8_t *frev, uint8_t *crev)
164{
165	CGS_FUNC_ADEV;
166
167	if (amdgpu_atom_parse_cmd_header(
168		    adev->mode_info.atom_context, table,
169		    frev, crev))
170		return 0;
171
172	return -EINVAL;
173}
174
175static int amdgpu_cgs_atom_exec_cmd_table(struct cgs_device *cgs_device, unsigned table,
176					  void *args)
177{
178	CGS_FUNC_ADEV;
179
180	return amdgpu_atom_execute_table(
181		adev->mode_info.atom_context, table, args);
182}
183
184static int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device,
185				  enum amd_ip_block_type block_type,
186				  enum amd_clockgating_state state)
187{
188	CGS_FUNC_ADEV;
189	int i, r = -1;
190
191	for (i = 0; i < adev->num_ip_blocks; i++) {
192		if (!adev->ip_blocks[i].status.valid)
193			continue;
194
195		if (adev->ip_blocks[i].version->type == block_type) {
196			r = adev->ip_blocks[i].version->funcs->set_clockgating_state(
197								(void *)adev,
198									state);
199			break;
200		}
201	}
202	return r;
203}
204
205static int amdgpu_cgs_set_powergating_state(struct cgs_device *cgs_device,
206				  enum amd_ip_block_type block_type,
207				  enum amd_powergating_state state)
208{
209	CGS_FUNC_ADEV;
210	int i, r = -1;
211
212	for (i = 0; i < adev->num_ip_blocks; i++) {
213		if (!adev->ip_blocks[i].status.valid)
214			continue;
215
216		if (adev->ip_blocks[i].version->type == block_type) {
217			r = adev->ip_blocks[i].version->funcs->set_powergating_state(
218								(void *)adev,
219									state);
220			break;
221		}
222	}
223	return r;
224}
225
226
227static uint32_t fw_type_convert(struct cgs_device *cgs_device, uint32_t fw_type)
228{
229	CGS_FUNC_ADEV;
230	enum AMDGPU_UCODE_ID result = AMDGPU_UCODE_ID_MAXIMUM;
231
232	switch (fw_type) {
233	case CGS_UCODE_ID_SDMA0:
234		result = AMDGPU_UCODE_ID_SDMA0;
235		break;
236	case CGS_UCODE_ID_SDMA1:
237		result = AMDGPU_UCODE_ID_SDMA1;
238		break;
239	case CGS_UCODE_ID_CP_CE:
240		result = AMDGPU_UCODE_ID_CP_CE;
241		break;
242	case CGS_UCODE_ID_CP_PFP:
243		result = AMDGPU_UCODE_ID_CP_PFP;
244		break;
245	case CGS_UCODE_ID_CP_ME:
246		result = AMDGPU_UCODE_ID_CP_ME;
247		break;
248	case CGS_UCODE_ID_CP_MEC:
249	case CGS_UCODE_ID_CP_MEC_JT1:
250		result = AMDGPU_UCODE_ID_CP_MEC1;
251		break;
252	case CGS_UCODE_ID_CP_MEC_JT2:
253		/* for VI. JT2 should be the same as JT1, because:
254			1, MEC2 and MEC1 use exactly same FW.
255			2, JT2 is not pached but JT1 is.
256		*/
257		if (adev->asic_type >= CHIP_TOPAZ)
258			result = AMDGPU_UCODE_ID_CP_MEC1;
259		else
260			result = AMDGPU_UCODE_ID_CP_MEC2;
261		break;
262	case CGS_UCODE_ID_RLC_G:
263		result = AMDGPU_UCODE_ID_RLC_G;
264		break;
265	case CGS_UCODE_ID_STORAGE:
266		result = AMDGPU_UCODE_ID_STORAGE;
267		break;
268	default:
269		DRM_ERROR("Firmware type not supported\n");
270	}
271	return result;
272}
273
274static int amdgpu_cgs_rel_firmware(struct cgs_device *cgs_device, enum cgs_ucode_id type)
275{
276	CGS_FUNC_ADEV;
277	if ((CGS_UCODE_ID_SMU == type) || (CGS_UCODE_ID_SMU_SK == type)) {
278		release_firmware(adev->pm.fw);
279		adev->pm.fw = NULL;
280		return 0;
281	}
282	/* cannot release other firmware because they are not created by cgs */
283	return -EINVAL;
284}
285
286static uint16_t amdgpu_get_firmware_version(struct cgs_device *cgs_device,
287					enum cgs_ucode_id type)
288{
289	CGS_FUNC_ADEV;
290	uint16_t fw_version = 0;
291
292	switch (type) {
293		case CGS_UCODE_ID_SDMA0:
294			fw_version = adev->sdma.instance[0].fw_version;
295			break;
296		case CGS_UCODE_ID_SDMA1:
297			fw_version = adev->sdma.instance[1].fw_version;
298			break;
299		case CGS_UCODE_ID_CP_CE:
300			fw_version = adev->gfx.ce_fw_version;
301			break;
302		case CGS_UCODE_ID_CP_PFP:
303			fw_version = adev->gfx.pfp_fw_version;
304			break;
305		case CGS_UCODE_ID_CP_ME:
306			fw_version = adev->gfx.me_fw_version;
307			break;
308		case CGS_UCODE_ID_CP_MEC:
309			fw_version = adev->gfx.mec_fw_version;
310			break;
311		case CGS_UCODE_ID_CP_MEC_JT1:
312			fw_version = adev->gfx.mec_fw_version;
313			break;
314		case CGS_UCODE_ID_CP_MEC_JT2:
315			fw_version = adev->gfx.mec_fw_version;
316			break;
317		case CGS_UCODE_ID_RLC_G:
318			fw_version = adev->gfx.rlc_fw_version;
319			break;
320		case CGS_UCODE_ID_STORAGE:
321			break;
322		default:
323			DRM_ERROR("firmware type %d do not have version\n", type);
324			break;
325	}
326	return fw_version;
327}
328
329static int amdgpu_cgs_enter_safe_mode(struct cgs_device *cgs_device,
330					bool en)
331{
332	CGS_FUNC_ADEV;
333
334	if (adev->gfx.rlc.funcs->enter_safe_mode == NULL ||
335		adev->gfx.rlc.funcs->exit_safe_mode == NULL)
336		return 0;
337
338	if (en)
339		adev->gfx.rlc.funcs->enter_safe_mode(adev);
340	else
341		adev->gfx.rlc.funcs->exit_safe_mode(adev);
342
343	return 0;
344}
345
346static void amdgpu_cgs_lock_grbm_idx(struct cgs_device *cgs_device,
347					bool lock)
348{
349	CGS_FUNC_ADEV;
350
351	if (lock)
352		mutex_lock(&adev->grbm_idx_mutex);
353	else
354		mutex_unlock(&adev->grbm_idx_mutex);
355}
356
357static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
358					enum cgs_ucode_id type,
359					struct cgs_firmware_info *info)
360{
361	CGS_FUNC_ADEV;
362
363	if ((CGS_UCODE_ID_SMU != type) && (CGS_UCODE_ID_SMU_SK != type)) {
364		uint64_t gpu_addr;
365		uint32_t data_size;
366		const struct gfx_firmware_header_v1_0 *header;
367		enum AMDGPU_UCODE_ID id;
368		struct amdgpu_firmware_info *ucode;
369
370		id = fw_type_convert(cgs_device, type);
371		ucode = &adev->firmware.ucode[id];
372		if (ucode->fw == NULL)
373			return -EINVAL;
374
375		gpu_addr  = ucode->mc_addr;
376		header = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data;
377		data_size = le32_to_cpu(header->header.ucode_size_bytes);
378
379		if ((type == CGS_UCODE_ID_CP_MEC_JT1) ||
380		    (type == CGS_UCODE_ID_CP_MEC_JT2)) {
381			gpu_addr += ALIGN(le32_to_cpu(header->header.ucode_size_bytes), PAGE_SIZE);
382			data_size = le32_to_cpu(header->jt_size) << 2;
383		}
384
385		info->kptr = ucode->kaddr;
386		info->image_size = data_size;
387		info->mc_addr = gpu_addr;
388		info->version = (uint16_t)le32_to_cpu(header->header.ucode_version);
389
390		if (CGS_UCODE_ID_CP_MEC == type)
391			info->image_size = le32_to_cpu(header->jt_offset) << 2;
392
393		info->fw_version = amdgpu_get_firmware_version(cgs_device, type);
394		info->feature_version = (uint16_t)le32_to_cpu(header->ucode_feature_version);
395	} else {
396		char fw_name[30] = {0};
397		int err = 0;
398		uint32_t ucode_size;
399		uint32_t ucode_start_address;
400		const uint8_t *src;
401		const struct smc_firmware_header_v1_0 *hdr;
402		const struct common_firmware_header *header;
403		struct amdgpu_firmware_info *ucode = NULL;
404
405		if (!adev->pm.fw) {
406			switch (adev->asic_type) {
407			case CHIP_TAHITI:
408				strcpy(fw_name, "radeon/tahiti_smc.bin");
409				break;
410			case CHIP_PITCAIRN:
411				if ((adev->pdev->revision == 0x81) &&
412				    ((adev->pdev->device == 0x6810) ||
413				    (adev->pdev->device == 0x6811))) {
414					info->is_kicker = true;
415					strcpy(fw_name, "radeon/pitcairn_k_smc.bin");
416				} else {
417					strcpy(fw_name, "radeon/pitcairn_smc.bin");
418				}
419				break;
420			case CHIP_VERDE:
421				if (((adev->pdev->device == 0x6820) &&
422					((adev->pdev->revision == 0x81) ||
423					(adev->pdev->revision == 0x83))) ||
424				    ((adev->pdev->device == 0x6821) &&
425					((adev->pdev->revision == 0x83) ||
426					(adev->pdev->revision == 0x87))) ||
427				    ((adev->pdev->revision == 0x87) &&
428					((adev->pdev->device == 0x6823) ||
429					(adev->pdev->device == 0x682b)))) {
430					info->is_kicker = true;
431					strcpy(fw_name, "radeon/verde_k_smc.bin");
432				} else {
433					strcpy(fw_name, "radeon/verde_smc.bin");
434				}
435				break;
436			case CHIP_OLAND:
437				if (((adev->pdev->revision == 0x81) &&
438					((adev->pdev->device == 0x6600) ||
439					(adev->pdev->device == 0x6604) ||
440					(adev->pdev->device == 0x6605) ||
441					(adev->pdev->device == 0x6610))) ||
442				    ((adev->pdev->revision == 0x83) &&
443					(adev->pdev->device == 0x6610))) {
444					info->is_kicker = true;
445					strcpy(fw_name, "radeon/oland_k_smc.bin");
446				} else {
447					strcpy(fw_name, "radeon/oland_smc.bin");
448				}
449				break;
450			case CHIP_HAINAN:
451				if (((adev->pdev->revision == 0x81) &&
452					(adev->pdev->device == 0x6660)) ||
453				    ((adev->pdev->revision == 0x83) &&
454					((adev->pdev->device == 0x6660) ||
455					(adev->pdev->device == 0x6663) ||
456					(adev->pdev->device == 0x6665) ||
457					 (adev->pdev->device == 0x6667)))) {
458					info->is_kicker = true;
459					strcpy(fw_name, "radeon/hainan_k_smc.bin");
460				} else if ((adev->pdev->revision == 0xc3) &&
461					 (adev->pdev->device == 0x6665)) {
462					info->is_kicker = true;
463					strcpy(fw_name, "radeon/banks_k_2_smc.bin");
464				} else {
465					strcpy(fw_name, "radeon/hainan_smc.bin");
466				}
467				break;
468			case CHIP_BONAIRE:
469				if ((adev->pdev->revision == 0x80) ||
470					(adev->pdev->revision == 0x81) ||
471					(adev->pdev->device == 0x665f)) {
472					info->is_kicker = true;
473					strcpy(fw_name, "radeon/bonaire_k_smc.bin");
474				} else {
475					strcpy(fw_name, "radeon/bonaire_smc.bin");
476				}
477				break;
478			case CHIP_HAWAII:
479				if (adev->pdev->revision == 0x80) {
480					info->is_kicker = true;
481					strcpy(fw_name, "radeon/hawaii_k_smc.bin");
482				} else {
483					strcpy(fw_name, "radeon/hawaii_smc.bin");
484				}
485				break;
486			case CHIP_TOPAZ:
487				if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) ||
488				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) ||
489				    ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87))) {
 
 
490					info->is_kicker = true;
491					strcpy(fw_name, "amdgpu/topaz_k_smc.bin");
492				} else
493					strcpy(fw_name, "amdgpu/topaz_smc.bin");
494				break;
495			case CHIP_TONGA:
496				if (((adev->pdev->device == 0x6939) && (adev->pdev->revision == 0xf1)) ||
497				    ((adev->pdev->device == 0x6938) && (adev->pdev->revision == 0xf1))) {
498					info->is_kicker = true;
499					strcpy(fw_name, "amdgpu/tonga_k_smc.bin");
500				} else
501					strcpy(fw_name, "amdgpu/tonga_smc.bin");
502				break;
503			case CHIP_FIJI:
504				strcpy(fw_name, "amdgpu/fiji_smc.bin");
505				break;
506			case CHIP_POLARIS11:
507				if (type == CGS_UCODE_ID_SMU) {
508					if (((adev->pdev->device == 0x67ef) &&
509					     ((adev->pdev->revision == 0xe0) ||
510					      (adev->pdev->revision == 0xe2) ||
511					      (adev->pdev->revision == 0xe5))) ||
512					    ((adev->pdev->device == 0x67ff) &&
513					     ((adev->pdev->revision == 0xcf) ||
514					      (adev->pdev->revision == 0xef) ||
515					      (adev->pdev->revision == 0xff)))) {
516						info->is_kicker = true;
517						strcpy(fw_name, "amdgpu/polaris11_k_smc.bin");
518					} else
 
 
 
519						strcpy(fw_name, "amdgpu/polaris11_smc.bin");
 
520				} else if (type == CGS_UCODE_ID_SMU_SK) {
521					strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin");
522				}
523				break;
524			case CHIP_POLARIS10:
525				if (type == CGS_UCODE_ID_SMU) {
526					if ((adev->pdev->device == 0x67df) &&
527					    ((adev->pdev->revision == 0xe0) ||
528					     (adev->pdev->revision == 0xe3) ||
529					     (adev->pdev->revision == 0xe4) ||
530					     (adev->pdev->revision == 0xe5) ||
531					     (adev->pdev->revision == 0xe7) ||
532					     (adev->pdev->revision == 0xef))) {
533						info->is_kicker = true;
534						strcpy(fw_name, "amdgpu/polaris10_k_smc.bin");
535					} else
 
 
 
536						strcpy(fw_name, "amdgpu/polaris10_smc.bin");
 
537				} else if (type == CGS_UCODE_ID_SMU_SK) {
538					strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin");
539				}
540				break;
541			case CHIP_POLARIS12:
542				strcpy(fw_name, "amdgpu/polaris12_smc.bin");
 
 
 
 
 
 
 
 
543				break;
544			case CHIP_VEGA10:
545				if ((adev->pdev->device == 0x687f) &&
546					((adev->pdev->revision == 0xc0) ||
547					(adev->pdev->revision == 0xc1) ||
548					(adev->pdev->revision == 0xc3)))
549					strcpy(fw_name, "amdgpu/vega10_acg_smc.bin");
550				else
551					strcpy(fw_name, "amdgpu/vega10_smc.bin");
552				break;
553			case CHIP_VEGA12:
554				strcpy(fw_name, "amdgpu/vega12_smc.bin");
555				break;
 
 
 
556			default:
557				DRM_ERROR("SMC firmware not supported\n");
558				return -EINVAL;
559			}
560
561			err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
562			if (err) {
563				DRM_ERROR("Failed to request firmware\n");
564				return err;
565			}
566
567			err = amdgpu_ucode_validate(adev->pm.fw);
568			if (err) {
569				DRM_ERROR("Failed to load firmware \"%s\"", fw_name);
570				release_firmware(adev->pm.fw);
571				adev->pm.fw = NULL;
572				return err;
573			}
574
575			if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
576				ucode = &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC];
577				ucode->ucode_id = AMDGPU_UCODE_ID_SMC;
578				ucode->fw = adev->pm.fw;
579				header = (const struct common_firmware_header *)ucode->fw->data;
580				adev->firmware.fw_size +=
581					ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
582			}
583		}
584
585		hdr = (const struct smc_firmware_header_v1_0 *)	adev->pm.fw->data;
586		amdgpu_ucode_print_smc_hdr(&hdr->header);
587		adev->pm.fw_version = le32_to_cpu(hdr->header.ucode_version);
588		ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
589		ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
590		src = (const uint8_t *)(adev->pm.fw->data +
591		       le32_to_cpu(hdr->header.ucode_array_offset_bytes));
592
593		info->version = adev->pm.fw_version;
594		info->image_size = ucode_size;
595		info->ucode_start_address = ucode_start_address;
596		info->kptr = (void *)src;
597	}
598	return 0;
599}
600
601static int amdgpu_cgs_is_virtualization_enabled(void *cgs_device)
602{
603	CGS_FUNC_ADEV;
604	return amdgpu_sriov_vf(adev);
605}
606
607static int amdgpu_cgs_get_active_displays_info(struct cgs_device *cgs_device,
608					  struct cgs_display_info *info)
609{
610	CGS_FUNC_ADEV;
611	struct cgs_mode_info *mode_info;
612
613	if (info == NULL)
614		return -EINVAL;
615
616	mode_info = info->mode_info;
617	if (mode_info)
618		/* if the displays are off, vblank time is max */
619		mode_info->vblank_time_us = 0xffffffff;
620
621	if (!amdgpu_device_has_dc_support(adev)) {
622		struct amdgpu_crtc *amdgpu_crtc;
623		struct drm_device *ddev = adev->ddev;
624		struct drm_crtc *crtc;
625		uint32_t line_time_us, vblank_lines;
626
627		if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) {
628			list_for_each_entry(crtc,
629					&ddev->mode_config.crtc_list, head) {
630				amdgpu_crtc = to_amdgpu_crtc(crtc);
631				if (crtc->enabled) {
632					info->active_display_mask |= (1 << amdgpu_crtc->crtc_id);
633					info->display_count++;
634				}
635				if (mode_info != NULL &&
636					crtc->enabled && amdgpu_crtc->enabled &&
637					amdgpu_crtc->hw_mode.clock) {
638					line_time_us = (amdgpu_crtc->hw_mode.crtc_htotal * 1000) /
639								amdgpu_crtc->hw_mode.clock;
640					vblank_lines = amdgpu_crtc->hw_mode.crtc_vblank_end -
641								amdgpu_crtc->hw_mode.crtc_vdisplay +
642								(amdgpu_crtc->v_border * 2);
643					mode_info->vblank_time_us = vblank_lines * line_time_us;
644					mode_info->refresh_rate = drm_mode_vrefresh(&amdgpu_crtc->hw_mode);
645					/* we have issues with mclk switching with refresh rates
646					 * over 120 hz on the non-DC code.
647					 */
648					if (mode_info->refresh_rate > 120)
649						mode_info->vblank_time_us = 0;
650					mode_info = NULL;
651				}
652			}
653		}
654	} else {
655		info->display_count = adev->pm.pm_display_cfg.num_display;
656		if (mode_info != NULL) {
657			mode_info->vblank_time_us = adev->pm.pm_display_cfg.min_vblank_time;
658			mode_info->refresh_rate = adev->pm.pm_display_cfg.vrefresh;
659		}
660	}
661	return 0;
662}
663
664
665static int amdgpu_cgs_notify_dpm_enabled(struct cgs_device *cgs_device, bool enabled)
666{
667	CGS_FUNC_ADEV;
668
669	adev->pm.dpm_enabled = enabled;
670
671	return 0;
672}
673
674static const struct cgs_ops amdgpu_cgs_ops = {
675	.read_register = amdgpu_cgs_read_register,
676	.write_register = amdgpu_cgs_write_register,
677	.read_ind_register = amdgpu_cgs_read_ind_register,
678	.write_ind_register = amdgpu_cgs_write_ind_register,
679	.get_pci_resource = amdgpu_cgs_get_pci_resource,
680	.atom_get_data_table = amdgpu_cgs_atom_get_data_table,
681	.atom_get_cmd_table_revs = amdgpu_cgs_atom_get_cmd_table_revs,
682	.atom_exec_cmd_table = amdgpu_cgs_atom_exec_cmd_table,
683	.get_firmware_info = amdgpu_cgs_get_firmware_info,
684	.rel_firmware = amdgpu_cgs_rel_firmware,
685	.set_powergating_state = amdgpu_cgs_set_powergating_state,
686	.set_clockgating_state = amdgpu_cgs_set_clockgating_state,
687	.get_active_displays_info = amdgpu_cgs_get_active_displays_info,
688	.notify_dpm_enabled = amdgpu_cgs_notify_dpm_enabled,
689	.is_virtualization_enabled = amdgpu_cgs_is_virtualization_enabled,
690	.enter_safe_mode = amdgpu_cgs_enter_safe_mode,
691	.lock_grbm_idx = amdgpu_cgs_lock_grbm_idx,
692};
693
694struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev)
695{
696	struct amdgpu_cgs_device *cgs_device =
697		kmalloc(sizeof(*cgs_device), GFP_KERNEL);
698
699	if (!cgs_device) {
700		DRM_ERROR("Couldn't allocate CGS device structure\n");
701		return NULL;
702	}
703
704	cgs_device->base.ops = &amdgpu_cgs_ops;
705	cgs_device->adev = adev;
706
707	return (struct cgs_device *)cgs_device;
708}
709
710void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device)
711{
712	kfree(cgs_device);
713}