Commit 1fd11777 authored by Alex Deucher's avatar Alex Deucher

drm/radeon: convert SI,CIK to use sumo_rlc functions

and remove duplicate si_rlc functions.
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 10b7ca7e
...@@ -57,9 +57,9 @@ extern void r600_ih_ring_fini(struct radeon_device *rdev); ...@@ -57,9 +57,9 @@ extern void r600_ih_ring_fini(struct radeon_device *rdev);
extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save); extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save); extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
extern bool evergreen_is_display_hung(struct radeon_device *rdev); extern bool evergreen_is_display_hung(struct radeon_device *rdev);
extern void sumo_rlc_fini(struct radeon_device *rdev);
extern int sumo_rlc_init(struct radeon_device *rdev);
extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
extern void si_rlc_fini(struct radeon_device *rdev);
extern int si_rlc_init(struct radeon_device *rdev);
extern void si_rlc_reset(struct radeon_device *rdev); extern void si_rlc_reset(struct radeon_device *rdev);
static void cik_rlc_stop(struct radeon_device *rdev); static void cik_rlc_stop(struct radeon_device *rdev);
static void cik_pcie_gen3_enable(struct radeon_device *rdev); static void cik_pcie_gen3_enable(struct radeon_device *rdev);
...@@ -6019,7 +6019,7 @@ static int cik_startup(struct radeon_device *rdev) ...@@ -6019,7 +6019,7 @@ static int cik_startup(struct radeon_device *rdev)
cik_gpu_init(rdev); cik_gpu_init(rdev);
/* allocate rlc buffers */ /* allocate rlc buffers */
r = si_rlc_init(rdev); r = sumo_rlc_init(rdev);
if (r) { if (r) {
DRM_ERROR("Failed to init rlc BOs!\n"); DRM_ERROR("Failed to init rlc BOs!\n");
return r; return r;
...@@ -6343,7 +6343,7 @@ int cik_init(struct radeon_device *rdev) ...@@ -6343,7 +6343,7 @@ int cik_init(struct radeon_device *rdev)
cik_cp_fini(rdev); cik_cp_fini(rdev);
cik_sdma_fini(rdev); cik_sdma_fini(rdev);
cik_irq_fini(rdev); cik_irq_fini(rdev);
si_rlc_fini(rdev); sumo_rlc_fini(rdev);
cik_mec_fini(rdev); cik_mec_fini(rdev);
radeon_wb_fini(rdev); radeon_wb_fini(rdev);
radeon_ib_pool_fini(rdev); radeon_ib_pool_fini(rdev);
...@@ -6379,7 +6379,7 @@ void cik_fini(struct radeon_device *rdev) ...@@ -6379,7 +6379,7 @@ void cik_fini(struct radeon_device *rdev)
cik_cp_fini(rdev); cik_cp_fini(rdev);
cik_sdma_fini(rdev); cik_sdma_fini(rdev);
cik_irq_fini(rdev); cik_irq_fini(rdev);
si_rlc_fini(rdev); sumo_rlc_fini(rdev);
cik_mec_fini(rdev); cik_mec_fini(rdev);
radeon_wb_fini(rdev); radeon_wb_fini(rdev);
radeon_vm_manager_fini(rdev); radeon_vm_manager_fini(rdev);
......
...@@ -1073,7 +1073,7 @@ static const struct cs_extent_def SECT_CTRLCONST_defs[] = ...@@ -1073,7 +1073,7 @@ static const struct cs_extent_def SECT_CTRLCONST_defs[] =
{SECT_CTRLCONST_def_1, 0x0000f3fc, 2 }, {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 },
{ 0, 0, 0 } { 0, 0, 0 }
}; };
struct cs_section_def cayman_cs_data[] = { static const struct cs_section_def cayman_cs_data[] = {
{ SECT_CONTEXT_defs, SECT_CONTEXT }, { SECT_CONTEXT_defs, SECT_CONTEXT },
{ SECT_CLEAR_defs, SECT_CLEAR }, { SECT_CLEAR_defs, SECT_CLEAR },
{ SECT_CTRLCONST_defs, SECT_CTRLCONST }, { SECT_CTRLCONST_defs, SECT_CTRLCONST },
......
...@@ -1072,7 +1072,7 @@ static const struct cs_extent_def SECT_CTRLCONST_defs[] = ...@@ -1072,7 +1072,7 @@ static const struct cs_extent_def SECT_CTRLCONST_defs[] =
{SECT_CTRLCONST_def_1, 0x0000f3fc, 2 }, {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 },
{ 0, 0, 0 } { 0, 0, 0 }
}; };
struct cs_section_def evergreen_cs_data[] = { static const struct cs_section_def evergreen_cs_data[] = {
{ SECT_CONTEXT_defs, SECT_CONTEXT }, { SECT_CONTEXT_defs, SECT_CONTEXT },
{ SECT_CLEAR_defs, SECT_CLEAR }, { SECT_CLEAR_defs, SECT_CLEAR },
{ SECT_CTRLCONST_defs, SECT_CTRLCONST }, { SECT_CTRLCONST_defs, SECT_CTRLCONST },
......
...@@ -47,7 +47,7 @@ static const u32 crtc_offsets[6] = ...@@ -47,7 +47,7 @@ static const u32 crtc_offsets[6] =
#include "clearstate_evergreen.h" #include "clearstate_evergreen.h"
static u32 sumo_rlc_save_restore_register_list[] = static const u32 sumo_rlc_save_restore_register_list[] =
{ {
0x98fc, 0x98fc,
0x9830, 0x9830,
...@@ -131,7 +131,6 @@ static u32 sumo_rlc_save_restore_register_list[] = ...@@ -131,7 +131,6 @@ static u32 sumo_rlc_save_restore_register_list[] =
0x9150, 0x9150,
0x802c, 0x802c,
}; };
static u32 sumo_rlc_save_restore_register_list_size = ARRAY_SIZE(sumo_rlc_save_restore_register_list);
static void evergreen_gpu_init(struct radeon_device *rdev); static void evergreen_gpu_init(struct radeon_device *rdev);
void evergreen_fini(struct radeon_device *rdev); void evergreen_fini(struct radeon_device *rdev);
...@@ -3898,12 +3897,12 @@ void sumo_rlc_fini(struct radeon_device *rdev) ...@@ -3898,12 +3897,12 @@ void sumo_rlc_fini(struct radeon_device *rdev)
int sumo_rlc_init(struct radeon_device *rdev) int sumo_rlc_init(struct radeon_device *rdev)
{ {
u32 *src_ptr; const u32 *src_ptr;
volatile u32 *dst_ptr; volatile u32 *dst_ptr;
u32 dws, data, i, j, k, reg_num; u32 dws, data, i, j, k, reg_num;
u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index; u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index;
u64 reg_list_mc_addr; u64 reg_list_mc_addr;
struct cs_section_def *cs_data; const struct cs_section_def *cs_data;
int r; int r;
src_ptr = rdev->rlc.reg_list; src_ptr = rdev->rlc.reg_list;
...@@ -3943,22 +3942,28 @@ int sumo_rlc_init(struct radeon_device *rdev) ...@@ -3943,22 +3942,28 @@ int sumo_rlc_init(struct radeon_device *rdev)
} }
/* write the sr buffer */ /* write the sr buffer */
dst_ptr = rdev->rlc.sr_ptr; dst_ptr = rdev->rlc.sr_ptr;
/* format: if (rdev->family >= CHIP_TAHITI) {
* dw0: (reg2 << 16) | reg1 /* SI */
* dw1: reg1 save space for (i = 0; i < dws; i++)
* dw2: reg2 save space dst_ptr[i] = src_ptr[i];
*/ } else {
for (i = 0; i < dws; i++) { /* ON/LN/TN */
data = src_ptr[i] >> 2; /* format:
i++; * dw0: (reg2 << 16) | reg1
if (i < dws) * dw1: reg1 save space
data |= (src_ptr[i] >> 2) << 16; * dw2: reg2 save space
j = (((i - 1) * 3) / 2); */
dst_ptr[j] = data; for (i = 0; i < dws; i++) {
data = src_ptr[i] >> 2;
i++;
if (i < dws)
data |= (src_ptr[i] >> 2) << 16;
j = (((i - 1) * 3) / 2);
dst_ptr[j] = data;
}
j = ((i * 3) / 2);
dst_ptr[j] = RLC_SAVE_RESTORE_LIST_END_MARKER;
} }
j = ((i * 3) / 2);
dst_ptr[j] = RLC_SAVE_RESTORE_LIST_END_MARKER;
radeon_bo_kunmap(rdev->rlc.save_restore_obj); radeon_bo_kunmap(rdev->rlc.save_restore_obj);
radeon_bo_unreserve(rdev->rlc.save_restore_obj); radeon_bo_unreserve(rdev->rlc.save_restore_obj);
} }
...@@ -5152,7 +5157,8 @@ static int evergreen_startup(struct radeon_device *rdev) ...@@ -5152,7 +5157,8 @@ static int evergreen_startup(struct radeon_device *rdev)
/* allocate rlc buffers */ /* allocate rlc buffers */
if (rdev->flags & RADEON_IS_IGP) { if (rdev->flags & RADEON_IS_IGP) {
rdev->rlc.reg_list = sumo_rlc_save_restore_register_list; rdev->rlc.reg_list = sumo_rlc_save_restore_register_list;
rdev->rlc.reg_list_size = sumo_rlc_save_restore_register_list_size; rdev->rlc.reg_list_size =
(u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list);
rdev->rlc.cs_data = evergreen_cs_data; rdev->rlc.cs_data = evergreen_cs_data;
r = sumo_rlc_init(rdev); r = sumo_rlc_init(rdev);
if (r) { if (r) {
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include "radeon_ucode.h" #include "radeon_ucode.h"
#include "clearstate_cayman.h" #include "clearstate_cayman.h"
static u32 tn_rlc_save_restore_register_list[] = static const u32 tn_rlc_save_restore_register_list[] =
{ {
0x98fc, 0x98fc,
0x98f0, 0x98f0,
...@@ -160,7 +160,6 @@ static u32 tn_rlc_save_restore_register_list[] = ...@@ -160,7 +160,6 @@ static u32 tn_rlc_save_restore_register_list[] =
0x9830, 0x9830,
0x802c, 0x802c,
}; };
static u32 tn_rlc_save_restore_register_list_size = ARRAY_SIZE(tn_rlc_save_restore_register_list);
extern bool evergreen_is_display_hung(struct radeon_device *rdev); extern bool evergreen_is_display_hung(struct radeon_device *rdev);
extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
...@@ -2121,7 +2120,8 @@ static int cayman_startup(struct radeon_device *rdev) ...@@ -2121,7 +2120,8 @@ static int cayman_startup(struct radeon_device *rdev)
/* allocate rlc buffers */ /* allocate rlc buffers */
if (rdev->flags & RADEON_IS_IGP) { if (rdev->flags & RADEON_IS_IGP) {
rdev->rlc.reg_list = tn_rlc_save_restore_register_list; rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
rdev->rlc.reg_list_size = tn_rlc_save_restore_register_list_size; rdev->rlc.reg_list_size =
(u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
rdev->rlc.cs_data = cayman_cs_data; rdev->rlc.cs_data = cayman_cs_data;
r = sumo_rlc_init(rdev); r = sumo_rlc_init(rdev);
if (r) { if (r) {
......
...@@ -854,13 +854,13 @@ struct radeon_rlc { ...@@ -854,13 +854,13 @@ struct radeon_rlc {
struct radeon_bo *save_restore_obj; struct radeon_bo *save_restore_obj;
uint64_t save_restore_gpu_addr; uint64_t save_restore_gpu_addr;
volatile uint32_t *sr_ptr; volatile uint32_t *sr_ptr;
u32 *reg_list; const u32 *reg_list;
u32 reg_list_size; u32 reg_list_size;
/* for clear state */ /* for clear state */
struct radeon_bo *clear_state_obj; struct radeon_bo *clear_state_obj;
uint64_t clear_state_gpu_addr; uint64_t clear_state_gpu_addr;
volatile uint32_t *cs_ptr; volatile uint32_t *cs_ptr;
struct cs_section_def *cs_data; const struct cs_section_def *cs_data;
}; };
int radeon_ib_get(struct radeon_device *rdev, int ring, int radeon_ib_get(struct radeon_device *rdev, int ring,
......
...@@ -68,6 +68,8 @@ MODULE_FIRMWARE("radeon/HAINAN_smc.bin"); ...@@ -68,6 +68,8 @@ MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
static void si_pcie_gen3_enable(struct radeon_device *rdev); static void si_pcie_gen3_enable(struct radeon_device *rdev);
static void si_program_aspm(struct radeon_device *rdev); static void si_program_aspm(struct radeon_device *rdev);
extern void sumo_rlc_fini(struct radeon_device *rdev);
extern int sumo_rlc_init(struct radeon_device *rdev);
extern int r600_ih_ring_alloc(struct radeon_device *rdev); extern int r600_ih_ring_alloc(struct radeon_device *rdev);
extern void r600_ih_ring_fini(struct radeon_device *rdev); extern void r600_ih_ring_fini(struct radeon_device *rdev);
extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev); extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
...@@ -5275,166 +5277,6 @@ static void si_fini_pg(struct radeon_device *rdev) ...@@ -5275,166 +5277,6 @@ static void si_fini_pg(struct radeon_device *rdev)
/* /*
* RLC * RLC
*/ */
void si_rlc_fini(struct radeon_device *rdev)
{
int r;
/* save restore block */
if (rdev->rlc.save_restore_obj) {
r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
if (unlikely(r != 0))
dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
radeon_bo_unpin(rdev->rlc.save_restore_obj);
radeon_bo_unreserve(rdev->rlc.save_restore_obj);
radeon_bo_unref(&rdev->rlc.save_restore_obj);
rdev->rlc.save_restore_obj = NULL;
}
/* clear state block */
if (rdev->rlc.clear_state_obj) {
r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
if (unlikely(r != 0))
dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
radeon_bo_unpin(rdev->rlc.clear_state_obj);
radeon_bo_unreserve(rdev->rlc.clear_state_obj);
radeon_bo_unref(&rdev->rlc.clear_state_obj);
rdev->rlc.clear_state_obj = NULL;
}
}
#define RLC_CLEAR_STATE_END_MARKER 0x00000001
int si_rlc_init(struct radeon_device *rdev)
{
volatile u32 *dst_ptr;
u32 dws, data, i, j, k, reg_num;
u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index;
u64 reg_list_mc_addr;
const struct cs_section_def *cs_data = si_cs_data;
int r;
/* save restore block */
if (rdev->rlc.save_restore_obj == NULL) {
r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
RADEON_GEM_DOMAIN_VRAM, NULL,
&rdev->rlc.save_restore_obj);
if (r) {
dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
return r;
}
}
r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
if (unlikely(r != 0)) {
si_rlc_fini(rdev);
return r;
}
r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
&rdev->rlc.save_restore_gpu_addr);
if (r) {
radeon_bo_unreserve(rdev->rlc.save_restore_obj);
dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
si_rlc_fini(rdev);
return r;
}
if (rdev->family == CHIP_VERDE) {
r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
if (r) {
dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
si_rlc_fini(rdev);
return r;
}
/* write the sr buffer */
dst_ptr = rdev->rlc.sr_ptr;
for (i = 0; i < ARRAY_SIZE(verde_rlc_save_restore_register_list); i++) {
dst_ptr[i] = verde_rlc_save_restore_register_list[i];
}
radeon_bo_kunmap(rdev->rlc.save_restore_obj);
}
radeon_bo_unreserve(rdev->rlc.save_restore_obj);
/* clear state block */
reg_list_num = 0;
dws = 0;
for (i = 0; cs_data[i].section != NULL; i++) {
for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
reg_list_num++;
dws += cs_data[i].section[j].reg_count;
}
}
reg_list_blk_index = (3 * reg_list_num + 2);
dws += reg_list_blk_index;
if (rdev->rlc.clear_state_obj == NULL) {
r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.clear_state_obj);
if (r) {
dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
si_rlc_fini(rdev);
return r;
}
}
r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
if (unlikely(r != 0)) {
si_rlc_fini(rdev);
return r;
}
r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
&rdev->rlc.clear_state_gpu_addr);
if (r) {
radeon_bo_unreserve(rdev->rlc.clear_state_obj);
dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
si_rlc_fini(rdev);
return r;
}
r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr);
if (r) {
dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r);
si_rlc_fini(rdev);
return r;
}
/* set up the cs buffer */
dst_ptr = rdev->rlc.cs_ptr;
reg_list_hdr_blk_index = 0;
reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
data = upper_32_bits(reg_list_mc_addr);
dst_ptr[reg_list_hdr_blk_index] = data;
reg_list_hdr_blk_index++;
for (i = 0; cs_data[i].section != NULL; i++) {
for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
reg_num = cs_data[i].section[j].reg_count;
data = reg_list_mc_addr & 0xffffffff;
dst_ptr[reg_list_hdr_blk_index] = data;
reg_list_hdr_blk_index++;
data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
dst_ptr[reg_list_hdr_blk_index] = data;
reg_list_hdr_blk_index++;
data = 0x08000000 | (reg_num * 4);
dst_ptr[reg_list_hdr_blk_index] = data;
reg_list_hdr_blk_index++;
for (k = 0; k < reg_num; k++) {
data = cs_data[i].section[j].extent[k];
dst_ptr[reg_list_blk_index + k] = data;
}
reg_list_mc_addr += reg_num * 4;
reg_list_blk_index += reg_num;
}
}
dst_ptr[reg_list_hdr_blk_index] = RLC_CLEAR_STATE_END_MARKER;
radeon_bo_kunmap(rdev->rlc.clear_state_obj);
radeon_bo_unreserve(rdev->rlc.clear_state_obj);
return 0;
}
void si_rlc_reset(struct radeon_device *rdev) void si_rlc_reset(struct radeon_device *rdev)
{ {
u32 tmp = RREG32(GRBM_SOFT_RESET); u32 tmp = RREG32(GRBM_SOFT_RESET);
...@@ -6449,7 +6291,13 @@ static int si_startup(struct radeon_device *rdev) ...@@ -6449,7 +6291,13 @@ static int si_startup(struct radeon_device *rdev)
si_gpu_init(rdev); si_gpu_init(rdev);
/* allocate rlc buffers */ /* allocate rlc buffers */
r = si_rlc_init(rdev); if (rdev->family == CHIP_VERDE) {
rdev->rlc.reg_list = verde_rlc_save_restore_register_list;
rdev->rlc.reg_list_size =
(u32)ARRAY_SIZE(verde_rlc_save_restore_register_list);
}
rdev->rlc.cs_data = si_cs_data;
r = sumo_rlc_init(rdev);
if (r) { if (r) {
DRM_ERROR("Failed to init rlc BOs!\n"); DRM_ERROR("Failed to init rlc BOs!\n");
return r; return r;
...@@ -6735,7 +6583,7 @@ int si_init(struct radeon_device *rdev) ...@@ -6735,7 +6583,7 @@ int si_init(struct radeon_device *rdev)
si_cp_fini(rdev); si_cp_fini(rdev);
cayman_dma_fini(rdev); cayman_dma_fini(rdev);
si_irq_fini(rdev); si_irq_fini(rdev);
si_rlc_fini(rdev); sumo_rlc_fini(rdev);
radeon_wb_fini(rdev); radeon_wb_fini(rdev);
radeon_ib_pool_fini(rdev); radeon_ib_pool_fini(rdev);
radeon_vm_manager_fini(rdev); radeon_vm_manager_fini(rdev);
...@@ -6761,7 +6609,7 @@ void si_fini(struct radeon_device *rdev) ...@@ -6761,7 +6609,7 @@ void si_fini(struct radeon_device *rdev)
si_cp_fini(rdev); si_cp_fini(rdev);
cayman_dma_fini(rdev); cayman_dma_fini(rdev);
si_irq_fini(rdev); si_irq_fini(rdev);
si_rlc_fini(rdev); sumo_rlc_fini(rdev);
si_fini_cg(rdev); si_fini_cg(rdev);
si_fini_pg(rdev); si_fini_pg(rdev);
radeon_wb_fini(rdev); radeon_wb_fini(rdev);
......
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