Commit 8ffff9b4 authored by Oak Zeng's avatar Oak Zeng Committed by Alex Deucher

drm/amdgpu: use function pointer for gfxhub functions

gfxhub functions are now called from function pointers,
instead of from asic-specific functions.
Signed-off-by: default avatarOak Zeng <Oak.Zeng@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 825c91d0
...@@ -104,6 +104,7 @@ ...@@ -104,6 +104,7 @@
#include "amdgpu_mes.h" #include "amdgpu_mes.h"
#include "amdgpu_umc.h" #include "amdgpu_umc.h"
#include "amdgpu_mmhub.h" #include "amdgpu_mmhub.h"
#include "amdgpu_gfxhub.h"
#include "amdgpu_df.h" #include "amdgpu_df.h"
#define MAX_GPU_INSTANCE 16 #define MAX_GPU_INSTANCE 16
...@@ -881,6 +882,9 @@ struct amdgpu_device { ...@@ -881,6 +882,9 @@ struct amdgpu_device {
/* mmhub */ /* mmhub */
struct amdgpu_mmhub mmhub; struct amdgpu_mmhub mmhub;
/* gfxhub */
struct amdgpu_gfxhub gfxhub;
/* gfx */ /* gfx */
struct amdgpu_gfx gfx; struct amdgpu_gfx gfx;
......
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
#include "v10_structs.h" #include "v10_structs.h"
#include "nv.h" #include "nv.h"
#include "nvd.h" #include "nvd.h"
#include "gfxhub_v2_0.h"
enum hqd_dequeue_request_type { enum hqd_dequeue_request_type {
NO_ACTION = 0, NO_ACTION = 0,
...@@ -753,7 +752,7 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, ...@@ -753,7 +752,7 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
} }
/* SDMA is on gfxhub as well for Navi1* series */ /* SDMA is on gfxhub as well for Navi1* series */
gfxhub_v2_0_setup_vm_pt_regs(adev, vmid, page_table_base); adev->gfxhub.funcs->setup_vm_pt_regs(adev, vmid, page_table_base);
} }
const struct kfd2kgd_calls gfx_v10_kfd2kgd = { const struct kfd2kgd_calls gfx_v10_kfd2kgd = {
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include "v10_structs.h" #include "v10_structs.h"
#include "nv.h" #include "nv.h"
#include "nvd.h" #include "nvd.h"
#include "gfxhub_v2_1.h"
enum hqd_dequeue_request_type { enum hqd_dequeue_request_type {
NO_ACTION = 0, NO_ACTION = 0,
...@@ -657,7 +656,7 @@ static void set_vm_context_page_table_base_v10_3(struct kgd_dev *kgd, uint32_t v ...@@ -657,7 +656,7 @@ static void set_vm_context_page_table_base_v10_3(struct kgd_dev *kgd, uint32_t v
struct amdgpu_device *adev = get_amdgpu_device(kgd); struct amdgpu_device *adev = get_amdgpu_device(kgd);
/* SDMA is on gfxhub as well for Navi1* series */ /* SDMA is on gfxhub as well for Navi1* series */
gfxhub_v2_1_setup_vm_pt_regs(adev, vmid, page_table_base); adev->gfxhub.funcs->setup_vm_pt_regs(adev, vmid, page_table_base);
} }
#if 0 #if 0
......
...@@ -36,9 +36,6 @@ ...@@ -36,9 +36,6 @@
#include "v9_structs.h" #include "v9_structs.h"
#include "soc15.h" #include "soc15.h"
#include "soc15d.h" #include "soc15d.h"
#include "mmhub_v1_0.h"
#include "gfxhub_v1_0.h"
enum hqd_dequeue_request_type { enum hqd_dequeue_request_type {
NO_ACTION = 0, NO_ACTION = 0,
...@@ -703,7 +700,7 @@ void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd, ...@@ -703,7 +700,7 @@ void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd,
adev->mmhub.funcs->setup_vm_pt_regs(adev, vmid, page_table_base); adev->mmhub.funcs->setup_vm_pt_regs(adev, vmid, page_table_base);
gfxhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base); adev->gfxhub.funcs->setup_vm_pt_regs(adev, vmid, page_table_base);
} }
const struct kfd2kgd_calls gfx_v9_kfd2kgd = { const struct kfd2kgd_calls gfx_v9_kfd2kgd = {
......
/*
* Copyright 2020 Advanced Micro Devices, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
*/
#ifndef __AMDGPU_GFXHUB_H__
#define __AMDGPU_GFXHUB_H__
struct amdgpu_gfxhub_funcs {
u64 (*get_fb_location)(struct amdgpu_device *adev);
u64 (*get_mc_fb_offset)(struct amdgpu_device *adev);
void (*setup_vm_pt_regs)(struct amdgpu_device *adev, uint32_t vmid,
uint64_t page_table_base);
int (*gart_enable)(struct amdgpu_device *adev);
void (*gart_disable)(struct amdgpu_device *adev);
void (*set_fault_enable_default)(struct amdgpu_device *adev, bool value);
void (*init)(struct amdgpu_device *adev);
int (*get_xgmi_info)(struct amdgpu_device *adev);
};
struct amdgpu_gfxhub {
const struct amdgpu_gfxhub_funcs *funcs;
};
#endif
...@@ -403,3 +403,13 @@ void gfxhub_v1_0_init(struct amdgpu_device *adev) ...@@ -403,3 +403,13 @@ void gfxhub_v1_0_init(struct amdgpu_device *adev)
hub->eng_addr_distance = mmVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 - hub->eng_addr_distance = mmVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
mmVM_INVALIDATE_ENG0_ADDR_RANGE_LO32; mmVM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
} }
const struct amdgpu_gfxhub_funcs gfxhub_v1_0_funcs = {
.get_mc_fb_offset = gfxhub_v1_0_get_mc_fb_offset,
.setup_vm_pt_regs = gfxhub_v1_0_setup_vm_pt_regs,
.gart_enable = gfxhub_v1_0_gart_enable,
.gart_disable = gfxhub_v1_0_gart_disable,
.set_fault_enable_default = gfxhub_v1_0_set_fault_enable_default,
.init = gfxhub_v1_0_init,
};
...@@ -33,4 +33,5 @@ u64 gfxhub_v1_0_get_mc_fb_offset(struct amdgpu_device *adev); ...@@ -33,4 +33,5 @@ u64 gfxhub_v1_0_get_mc_fb_offset(struct amdgpu_device *adev);
void gfxhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid, void gfxhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
uint64_t page_table_base); uint64_t page_table_base);
extern const struct amdgpu_gfxhub_funcs gfxhub_v1_0_funcs;
#endif #endif
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
* *
*/ */
#include "amdgpu.h" #include "amdgpu.h"
#include "gfxhub_v1_0.h"
#include "gfxhub_v1_1.h" #include "gfxhub_v1_1.h"
#include "gc/gc_9_2_1_offset.h" #include "gc/gc_9_2_1_offset.h"
...@@ -28,7 +29,7 @@ ...@@ -28,7 +29,7 @@
#include "soc15_common.h" #include "soc15_common.h"
int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev) static int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev)
{ {
u32 xgmi_lfb_cntl = RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_CNTL); u32 xgmi_lfb_cntl = RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_CNTL);
u32 max_region = u32 max_region =
...@@ -66,3 +67,13 @@ int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev) ...@@ -66,3 +67,13 @@ int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev)
return 0; return 0;
} }
const struct amdgpu_gfxhub_funcs gfxhub_v1_1_funcs = {
.get_mc_fb_offset = gfxhub_v1_0_get_mc_fb_offset,
.setup_vm_pt_regs = gfxhub_v1_0_setup_vm_pt_regs,
.gart_enable = gfxhub_v1_0_gart_enable,
.gart_disable = gfxhub_v1_0_gart_disable,
.set_fault_enable_default = gfxhub_v1_0_set_fault_enable_default,
.init = gfxhub_v1_0_init,
.get_xgmi_info = gfxhub_v1_1_get_xgmi_info,
};
...@@ -24,6 +24,6 @@ ...@@ -24,6 +24,6 @@
#ifndef __GFXHUB_V1_1_H__ #ifndef __GFXHUB_V1_1_H__
#define __GFXHUB_V1_1_H__ #define __GFXHUB_V1_1_H__
int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev); extern const struct amdgpu_gfxhub_funcs gfxhub_v1_1_funcs;
#endif #endif
...@@ -102,7 +102,7 @@ gfxhub_v2_0_print_l2_protection_fault_status(struct amdgpu_device *adev, ...@@ -102,7 +102,7 @@ gfxhub_v2_0_print_l2_protection_fault_status(struct amdgpu_device *adev,
GCVM_L2_PROTECTION_FAULT_STATUS, RW)); GCVM_L2_PROTECTION_FAULT_STATUS, RW));
} }
u64 gfxhub_v2_0_get_fb_location(struct amdgpu_device *adev) static u64 gfxhub_v2_0_get_fb_location(struct amdgpu_device *adev)
{ {
u64 base = RREG32_SOC15(GC, 0, mmGCMC_VM_FB_LOCATION_BASE); u64 base = RREG32_SOC15(GC, 0, mmGCMC_VM_FB_LOCATION_BASE);
...@@ -112,12 +112,12 @@ u64 gfxhub_v2_0_get_fb_location(struct amdgpu_device *adev) ...@@ -112,12 +112,12 @@ u64 gfxhub_v2_0_get_fb_location(struct amdgpu_device *adev)
return base; return base;
} }
u64 gfxhub_v2_0_get_mc_fb_offset(struct amdgpu_device *adev) static u64 gfxhub_v2_0_get_mc_fb_offset(struct amdgpu_device *adev)
{ {
return (u64)RREG32_SOC15(GC, 0, mmGCMC_VM_FB_OFFSET) << 24; return (u64)RREG32_SOC15(GC, 0, mmGCMC_VM_FB_OFFSET) << 24;
} }
void gfxhub_v2_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid, static void gfxhub_v2_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
uint64_t page_table_base) uint64_t page_table_base)
{ {
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0];
...@@ -342,7 +342,7 @@ static void gfxhub_v2_0_program_invalidation(struct amdgpu_device *adev) ...@@ -342,7 +342,7 @@ static void gfxhub_v2_0_program_invalidation(struct amdgpu_device *adev)
} }
} }
int gfxhub_v2_0_gart_enable(struct amdgpu_device *adev) static int gfxhub_v2_0_gart_enable(struct amdgpu_device *adev)
{ {
/* GART Enable. */ /* GART Enable. */
gfxhub_v2_0_init_gart_aperture_regs(adev); gfxhub_v2_0_init_gart_aperture_regs(adev);
...@@ -358,7 +358,7 @@ int gfxhub_v2_0_gart_enable(struct amdgpu_device *adev) ...@@ -358,7 +358,7 @@ int gfxhub_v2_0_gart_enable(struct amdgpu_device *adev)
return 0; return 0;
} }
void gfxhub_v2_0_gart_disable(struct amdgpu_device *adev) static void gfxhub_v2_0_gart_disable(struct amdgpu_device *adev)
{ {
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0];
u32 tmp; u32 tmp;
...@@ -389,7 +389,7 @@ void gfxhub_v2_0_gart_disable(struct amdgpu_device *adev) ...@@ -389,7 +389,7 @@ void gfxhub_v2_0_gart_disable(struct amdgpu_device *adev)
* @adev: amdgpu_device pointer * @adev: amdgpu_device pointer
* @value: true redirects VM faults to the default page * @value: true redirects VM faults to the default page
*/ */
void gfxhub_v2_0_set_fault_enable_default(struct amdgpu_device *adev, static void gfxhub_v2_0_set_fault_enable_default(struct amdgpu_device *adev,
bool value) bool value)
{ {
u32 tmp; u32 tmp;
...@@ -431,7 +431,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v2_0_vmhub_funcs = { ...@@ -431,7 +431,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v2_0_vmhub_funcs = {
.get_invalidate_req = gfxhub_v2_0_get_invalidate_req, .get_invalidate_req = gfxhub_v2_0_get_invalidate_req,
}; };
void gfxhub_v2_0_init(struct amdgpu_device *adev) static void gfxhub_v2_0_init(struct amdgpu_device *adev)
{ {
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0];
...@@ -472,3 +472,13 @@ void gfxhub_v2_0_init(struct amdgpu_device *adev) ...@@ -472,3 +472,13 @@ void gfxhub_v2_0_init(struct amdgpu_device *adev)
hub->vmhub_funcs = &gfxhub_v2_0_vmhub_funcs; hub->vmhub_funcs = &gfxhub_v2_0_vmhub_funcs;
} }
const struct amdgpu_gfxhub_funcs gfxhub_v2_0_funcs = {
.get_fb_location = gfxhub_v2_0_get_fb_location,
.get_mc_fb_offset = gfxhub_v2_0_get_mc_fb_offset,
.setup_vm_pt_regs = gfxhub_v2_0_setup_vm_pt_regs,
.gart_enable = gfxhub_v2_0_gart_enable,
.gart_disable = gfxhub_v2_0_gart_disable,
.set_fault_enable_default = gfxhub_v2_0_set_fault_enable_default,
.init = gfxhub_v2_0_init,
};
...@@ -24,14 +24,6 @@ ...@@ -24,14 +24,6 @@
#ifndef __GFXHUB_V2_0_H__ #ifndef __GFXHUB_V2_0_H__
#define __GFXHUB_V2_0_H__ #define __GFXHUB_V2_0_H__
u64 gfxhub_v2_0_get_fb_location(struct amdgpu_device *adev); extern const struct amdgpu_gfxhub_funcs gfxhub_v2_0_funcs;
int gfxhub_v2_0_gart_enable(struct amdgpu_device *adev);
void gfxhub_v2_0_gart_disable(struct amdgpu_device *adev);
void gfxhub_v2_0_set_fault_enable_default(struct amdgpu_device *adev,
bool value);
void gfxhub_v2_0_init(struct amdgpu_device *adev);
u64 gfxhub_v2_0_get_mc_fb_offset(struct amdgpu_device *adev);
void gfxhub_v2_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
uint64_t page_table_base);
#endif #endif
...@@ -102,7 +102,7 @@ gfxhub_v2_1_print_l2_protection_fault_status(struct amdgpu_device *adev, ...@@ -102,7 +102,7 @@ gfxhub_v2_1_print_l2_protection_fault_status(struct amdgpu_device *adev,
GCVM_L2_PROTECTION_FAULT_STATUS, RW)); GCVM_L2_PROTECTION_FAULT_STATUS, RW));
} }
u64 gfxhub_v2_1_get_fb_location(struct amdgpu_device *adev) static u64 gfxhub_v2_1_get_fb_location(struct amdgpu_device *adev)
{ {
u64 base = RREG32_SOC15(GC, 0, mmGCMC_VM_FB_LOCATION_BASE); u64 base = RREG32_SOC15(GC, 0, mmGCMC_VM_FB_LOCATION_BASE);
...@@ -112,12 +112,12 @@ u64 gfxhub_v2_1_get_fb_location(struct amdgpu_device *adev) ...@@ -112,12 +112,12 @@ u64 gfxhub_v2_1_get_fb_location(struct amdgpu_device *adev)
return base; return base;
} }
u64 gfxhub_v2_1_get_mc_fb_offset(struct amdgpu_device *adev) static u64 gfxhub_v2_1_get_mc_fb_offset(struct amdgpu_device *adev)
{ {
return (u64)RREG32_SOC15(GC, 0, mmGCMC_VM_FB_OFFSET) << 24; return (u64)RREG32_SOC15(GC, 0, mmGCMC_VM_FB_OFFSET) << 24;
} }
void gfxhub_v2_1_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid, static void gfxhub_v2_1_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
uint64_t page_table_base) uint64_t page_table_base)
{ {
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0];
...@@ -348,7 +348,7 @@ static void gfxhub_v2_1_program_invalidation(struct amdgpu_device *adev) ...@@ -348,7 +348,7 @@ static void gfxhub_v2_1_program_invalidation(struct amdgpu_device *adev)
} }
} }
int gfxhub_v2_1_gart_enable(struct amdgpu_device *adev) static int gfxhub_v2_1_gart_enable(struct amdgpu_device *adev)
{ {
if (amdgpu_sriov_vf(adev)) { if (amdgpu_sriov_vf(adev)) {
/* /*
...@@ -376,7 +376,7 @@ int gfxhub_v2_1_gart_enable(struct amdgpu_device *adev) ...@@ -376,7 +376,7 @@ int gfxhub_v2_1_gart_enable(struct amdgpu_device *adev)
return 0; return 0;
} }
void gfxhub_v2_1_gart_disable(struct amdgpu_device *adev) static void gfxhub_v2_1_gart_disable(struct amdgpu_device *adev)
{ {
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0];
u32 tmp; u32 tmp;
...@@ -405,7 +405,7 @@ void gfxhub_v2_1_gart_disable(struct amdgpu_device *adev) ...@@ -405,7 +405,7 @@ void gfxhub_v2_1_gart_disable(struct amdgpu_device *adev)
* @adev: amdgpu_device pointer * @adev: amdgpu_device pointer
* @value: true redirects VM faults to the default page * @value: true redirects VM faults to the default page
*/ */
void gfxhub_v2_1_set_fault_enable_default(struct amdgpu_device *adev, static void gfxhub_v2_1_set_fault_enable_default(struct amdgpu_device *adev,
bool value) bool value)
{ {
u32 tmp; u32 tmp;
...@@ -454,7 +454,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v2_1_vmhub_funcs = { ...@@ -454,7 +454,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v2_1_vmhub_funcs = {
.get_invalidate_req = gfxhub_v2_1_get_invalidate_req, .get_invalidate_req = gfxhub_v2_1_get_invalidate_req,
}; };
void gfxhub_v2_1_init(struct amdgpu_device *adev) static void gfxhub_v2_1_init(struct amdgpu_device *adev)
{ {
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0];
...@@ -496,7 +496,7 @@ void gfxhub_v2_1_init(struct amdgpu_device *adev) ...@@ -496,7 +496,7 @@ void gfxhub_v2_1_init(struct amdgpu_device *adev)
hub->vmhub_funcs = &gfxhub_v2_1_vmhub_funcs; hub->vmhub_funcs = &gfxhub_v2_1_vmhub_funcs;
} }
int gfxhub_v2_1_get_xgmi_info(struct amdgpu_device *adev) static int gfxhub_v2_1_get_xgmi_info(struct amdgpu_device *adev)
{ {
u32 xgmi_lfb_cntl = RREG32_SOC15(GC, 0, mmGCMC_VM_XGMI_LFB_CNTL); u32 xgmi_lfb_cntl = RREG32_SOC15(GC, 0, mmGCMC_VM_XGMI_LFB_CNTL);
u32 max_region = u32 max_region =
...@@ -531,3 +531,14 @@ int gfxhub_v2_1_get_xgmi_info(struct amdgpu_device *adev) ...@@ -531,3 +531,14 @@ int gfxhub_v2_1_get_xgmi_info(struct amdgpu_device *adev)
return 0; return 0;
} }
const struct amdgpu_gfxhub_funcs gfxhub_v2_1_funcs = {
.get_fb_location = gfxhub_v2_1_get_fb_location,
.get_mc_fb_offset = gfxhub_v2_1_get_mc_fb_offset,
.setup_vm_pt_regs = gfxhub_v2_1_setup_vm_pt_regs,
.gart_enable = gfxhub_v2_1_gart_enable,
.gart_disable = gfxhub_v2_1_gart_disable,
.set_fault_enable_default = gfxhub_v2_1_set_fault_enable_default,
.init = gfxhub_v2_1_init,
.get_xgmi_info = gfxhub_v2_1_get_xgmi_info,
};
...@@ -24,16 +24,6 @@ ...@@ -24,16 +24,6 @@
#ifndef __GFXHUB_V2_1_H__ #ifndef __GFXHUB_V2_1_H__
#define __GFXHUB_V2_1_H__ #define __GFXHUB_V2_1_H__
u64 gfxhub_v2_1_get_fb_location(struct amdgpu_device *adev); extern const struct amdgpu_gfxhub_funcs gfxhub_v2_1_funcs;
int gfxhub_v2_1_gart_enable(struct amdgpu_device *adev);
void gfxhub_v2_1_gart_disable(struct amdgpu_device *adev);
void gfxhub_v2_1_set_fault_enable_default(struct amdgpu_device *adev,
bool value);
void gfxhub_v2_1_init(struct amdgpu_device *adev);
u64 gfxhub_v2_1_get_mc_fb_offset(struct amdgpu_device *adev);
void gfxhub_v2_1_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
uint64_t page_table_base);
int gfxhub_v2_1_get_xgmi_info(struct amdgpu_device *adev);
#endif #endif
...@@ -634,11 +634,26 @@ static void gmc_v10_0_set_mmhub_funcs(struct amdgpu_device *adev) ...@@ -634,11 +634,26 @@ static void gmc_v10_0_set_mmhub_funcs(struct amdgpu_device *adev)
adev->mmhub.funcs = &mmhub_v2_0_funcs; adev->mmhub.funcs = &mmhub_v2_0_funcs;
} }
static void gmc_v10_0_set_gfxhub_funcs(struct amdgpu_device *adev)
{
switch (adev->asic_type) {
case CHIP_SIENNA_CICHLID:
case CHIP_NAVY_FLOUNDER:
adev->gfxhub.funcs = &gfxhub_v2_1_funcs;
break;
default:
adev->gfxhub.funcs = &gfxhub_v2_0_funcs;
break;
}
}
static int gmc_v10_0_early_init(void *handle) static int gmc_v10_0_early_init(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
gmc_v10_0_set_mmhub_funcs(adev); gmc_v10_0_set_mmhub_funcs(adev);
gmc_v10_0_set_gfxhub_funcs(adev);
gmc_v10_0_set_gmc_funcs(adev); gmc_v10_0_set_gmc_funcs(adev);
gmc_v10_0_set_irq_funcs(adev); gmc_v10_0_set_irq_funcs(adev);
gmc_v10_0_set_umc_funcs(adev); gmc_v10_0_set_umc_funcs(adev);
...@@ -676,11 +691,7 @@ static void gmc_v10_0_vram_gtt_location(struct amdgpu_device *adev, ...@@ -676,11 +691,7 @@ static void gmc_v10_0_vram_gtt_location(struct amdgpu_device *adev,
{ {
u64 base = 0; u64 base = 0;
if (adev->asic_type == CHIP_SIENNA_CICHLID || base = adev->gfxhub.funcs->get_fb_location(adev);
adev->asic_type == CHIP_NAVY_FLOUNDER)
base = gfxhub_v2_1_get_fb_location(adev);
else
base = gfxhub_v2_0_get_fb_location(adev);
/* add the xgmi offset of the physical node */ /* add the xgmi offset of the physical node */
base += adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size; base += adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size;
...@@ -689,11 +700,7 @@ static void gmc_v10_0_vram_gtt_location(struct amdgpu_device *adev, ...@@ -689,11 +700,7 @@ static void gmc_v10_0_vram_gtt_location(struct amdgpu_device *adev,
amdgpu_gmc_gart_location(adev, mc); amdgpu_gmc_gart_location(adev, mc);
/* base offset of vram pages */ /* base offset of vram pages */
if (adev->asic_type == CHIP_SIENNA_CICHLID || adev->vm_manager.vram_base_offset = adev->gfxhub.funcs->get_mc_fb_offset(adev);
adev->asic_type == CHIP_NAVY_FLOUNDER)
adev->vm_manager.vram_base_offset = gfxhub_v2_1_get_mc_fb_offset(adev);
else
adev->vm_manager.vram_base_offset = gfxhub_v2_0_get_mc_fb_offset(adev);
/* add the xgmi offset of the physical node */ /* add the xgmi offset of the physical node */
adev->vm_manager.vram_base_offset += adev->vm_manager.vram_base_offset +=
...@@ -777,11 +784,7 @@ static int gmc_v10_0_sw_init(void *handle) ...@@ -777,11 +784,7 @@ static int gmc_v10_0_sw_init(void *handle)
int r, vram_width = 0, vram_type = 0, vram_vendor = 0; int r, vram_width = 0, vram_type = 0, vram_vendor = 0;
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
if (adev->asic_type == CHIP_SIENNA_CICHLID || adev->gfxhub.funcs->init(adev);
adev->asic_type == CHIP_NAVY_FLOUNDER)
gfxhub_v2_1_init(adev);
else
gfxhub_v2_0_init(adev);
adev->mmhub.funcs->init(adev); adev->mmhub.funcs->init(adev);
...@@ -852,7 +855,7 @@ static int gmc_v10_0_sw_init(void *handle) ...@@ -852,7 +855,7 @@ static int gmc_v10_0_sw_init(void *handle)
} }
if (adev->gmc.xgmi.supported) { if (adev->gmc.xgmi.supported) {
r = gfxhub_v2_1_get_xgmi_info(adev); r = adev->gfxhub.funcs->get_xgmi_info(adev);
if (r) if (r)
return r; return r;
} }
...@@ -944,11 +947,7 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev) ...@@ -944,11 +947,7 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev)
if (r) if (r)
return r; return r;
if (adev->asic_type == CHIP_SIENNA_CICHLID || r = adev->gfxhub.funcs->gart_enable(adev);
adev->asic_type == CHIP_NAVY_FLOUNDER)
r = gfxhub_v2_1_gart_enable(adev);
else
r = gfxhub_v2_0_gart_enable(adev);
if (r) if (r)
return r; return r;
...@@ -969,11 +968,7 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev) ...@@ -969,11 +968,7 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev)
value = (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) ? value = (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) ?
false : true; false : true;
if (adev->asic_type == CHIP_SIENNA_CICHLID || adev->gfxhub.funcs->set_fault_enable_default(adev, value);
adev->asic_type == CHIP_NAVY_FLOUNDER)
gfxhub_v2_1_set_fault_enable_default(adev, value);
else
gfxhub_v2_0_set_fault_enable_default(adev, value);
adev->mmhub.funcs->set_fault_enable_default(adev, value); adev->mmhub.funcs->set_fault_enable_default(adev, value);
gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB_0, 0); gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB_0, 0);
gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_GFXHUB_0, 0); gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_GFXHUB_0, 0);
...@@ -1014,11 +1009,7 @@ static int gmc_v10_0_hw_init(void *handle) ...@@ -1014,11 +1009,7 @@ static int gmc_v10_0_hw_init(void *handle)
*/ */
static void gmc_v10_0_gart_disable(struct amdgpu_device *adev) static void gmc_v10_0_gart_disable(struct amdgpu_device *adev)
{ {
if (adev->asic_type == CHIP_SIENNA_CICHLID || adev->gfxhub.funcs->gart_disable(adev);
adev->asic_type == CHIP_NAVY_FLOUNDER)
gfxhub_v2_1_gart_disable(adev);
else
gfxhub_v2_0_gart_disable(adev);
adev->mmhub.funcs->gart_disable(adev); adev->mmhub.funcs->gart_disable(adev);
amdgpu_gart_table_vram_unpin(adev); amdgpu_gart_table_vram_unpin(adev);
} }
......
...@@ -1164,6 +1164,19 @@ static void gmc_v9_0_set_mmhub_funcs(struct amdgpu_device *adev) ...@@ -1164,6 +1164,19 @@ static void gmc_v9_0_set_mmhub_funcs(struct amdgpu_device *adev)
} }
} }
static void gmc_v9_0_set_gfxhub_funcs(struct amdgpu_device *adev)
{
switch (adev->asic_type) {
case CHIP_ARCTURUS:
case CHIP_VEGA20:
adev->gfxhub.funcs = &gfxhub_v1_1_funcs;
break;
default:
adev->gfxhub.funcs = &gfxhub_v1_0_funcs;
break;
}
}
static int gmc_v9_0_early_init(void *handle) static int gmc_v9_0_early_init(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
...@@ -1172,6 +1185,7 @@ static int gmc_v9_0_early_init(void *handle) ...@@ -1172,6 +1185,7 @@ static int gmc_v9_0_early_init(void *handle)
gmc_v9_0_set_irq_funcs(adev); gmc_v9_0_set_irq_funcs(adev);
gmc_v9_0_set_umc_funcs(adev); gmc_v9_0_set_umc_funcs(adev);
gmc_v9_0_set_mmhub_funcs(adev); gmc_v9_0_set_mmhub_funcs(adev);
gmc_v9_0_set_gfxhub_funcs(adev);
adev->gmc.shared_aperture_start = 0x2000000000000000ULL; adev->gmc.shared_aperture_start = 0x2000000000000000ULL;
adev->gmc.shared_aperture_end = adev->gmc.shared_aperture_end =
...@@ -1234,7 +1248,7 @@ static void gmc_v9_0_vram_gtt_location(struct amdgpu_device *adev, ...@@ -1234,7 +1248,7 @@ static void gmc_v9_0_vram_gtt_location(struct amdgpu_device *adev,
amdgpu_gmc_gart_location(adev, mc); amdgpu_gmc_gart_location(adev, mc);
amdgpu_gmc_agp_location(adev, mc); amdgpu_gmc_agp_location(adev, mc);
/* base offset of vram pages */ /* base offset of vram pages */
adev->vm_manager.vram_base_offset = gfxhub_v1_0_get_mc_fb_offset(adev); adev->vm_manager.vram_base_offset = adev->gfxhub.funcs->get_mc_fb_offset(adev);
/* XXX: add the xgmi offset of the physical node? */ /* XXX: add the xgmi offset of the physical node? */
adev->vm_manager.vram_base_offset += adev->vm_manager.vram_base_offset +=
...@@ -1269,7 +1283,7 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev) ...@@ -1269,7 +1283,7 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
if (adev->flags & AMD_IS_APU) { if (adev->flags & AMD_IS_APU) {
adev->gmc.aper_base = gfxhub_v1_0_get_mc_fb_offset(adev); adev->gmc.aper_base = adev->gfxhub.funcs->get_mc_fb_offset(adev);
adev->gmc.aper_size = adev->gmc.real_vram_size; adev->gmc.aper_size = adev->gmc.real_vram_size;
} }
#endif #endif
...@@ -1339,7 +1353,7 @@ static int gmc_v9_0_sw_init(void *handle) ...@@ -1339,7 +1353,7 @@ static int gmc_v9_0_sw_init(void *handle)
int r, vram_width = 0, vram_type = 0, vram_vendor = 0; int r, vram_width = 0, vram_type = 0, vram_vendor = 0;
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
gfxhub_v1_0_init(adev); adev->gfxhub.funcs->init(adev);
adev->mmhub.funcs->init(adev); adev->mmhub.funcs->init(adev);
...@@ -1453,7 +1467,7 @@ static int gmc_v9_0_sw_init(void *handle) ...@@ -1453,7 +1467,7 @@ static int gmc_v9_0_sw_init(void *handle)
adev->need_swiotlb = drm_need_swiotlb(44); adev->need_swiotlb = drm_need_swiotlb(44);
if (adev->gmc.xgmi.supported) { if (adev->gmc.xgmi.supported) {
r = gfxhub_v1_1_get_xgmi_info(adev); r = adev->gfxhub.funcs->get_xgmi_info(adev);
if (r) if (r)
return r; return r;
} }
...@@ -1569,7 +1583,7 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev) ...@@ -1569,7 +1583,7 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
if (r) if (r)
return r; return r;
r = gfxhub_v1_0_gart_enable(adev); r = adev->gfxhub.funcs->gart_enable(adev);
if (r) if (r)
return r; return r;
...@@ -1636,7 +1650,7 @@ static int gmc_v9_0_hw_init(void *handle) ...@@ -1636,7 +1650,7 @@ static int gmc_v9_0_hw_init(void *handle)
value = true; value = true;
if (!amdgpu_sriov_vf(adev)) { if (!amdgpu_sriov_vf(adev)) {
gfxhub_v1_0_set_fault_enable_default(adev, value); adev->gfxhub.funcs->set_fault_enable_default(adev, value);
adev->mmhub.funcs->set_fault_enable_default(adev, value); adev->mmhub.funcs->set_fault_enable_default(adev, value);
} }
for (i = 0; i < adev->num_vmhubs; ++i) for (i = 0; i < adev->num_vmhubs; ++i)
...@@ -1659,7 +1673,7 @@ static int gmc_v9_0_hw_init(void *handle) ...@@ -1659,7 +1673,7 @@ static int gmc_v9_0_hw_init(void *handle)
*/ */
static void gmc_v9_0_gart_disable(struct amdgpu_device *adev) static void gmc_v9_0_gart_disable(struct amdgpu_device *adev)
{ {
gfxhub_v1_0_gart_disable(adev); adev->gfxhub.funcs->gart_disable(adev);
adev->mmhub.funcs->gart_disable(adev); adev->mmhub.funcs->gart_disable(adev);
amdgpu_gart_table_vram_unpin(adev); amdgpu_gart_table_vram_unpin(adev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment