186be9a04SYue Hin Lau /* 286be9a04SYue Hin Lau * Copyright 2012-15 Advanced Micro Devices, Inc. 386be9a04SYue Hin Lau * 486be9a04SYue Hin Lau * Permission is hereby granted, free of charge, to any person obtaining a 586be9a04SYue Hin Lau * copy of this software and associated documentation files (the "Software"), 686be9a04SYue Hin Lau * to deal in the Software without restriction, including without limitation 786be9a04SYue Hin Lau * the rights to use, copy, modify, merge, publish, distribute, sublicense, 886be9a04SYue Hin Lau * and/or sell copies of the Software, and to permit persons to whom the 986be9a04SYue Hin Lau * Software is furnished to do so, subject to the following conditions: 1086be9a04SYue Hin Lau * 1186be9a04SYue Hin Lau * The above copyright notice and this permission notice shall be included in 1286be9a04SYue Hin Lau * all copies or substantial portions of the Software. 1386be9a04SYue Hin Lau * 1486be9a04SYue Hin Lau * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1586be9a04SYue Hin Lau * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1686be9a04SYue Hin Lau * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1786be9a04SYue Hin Lau * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1886be9a04SYue Hin Lau * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1986be9a04SYue Hin Lau * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2086be9a04SYue Hin Lau * OTHER DEALINGS IN THE SOFTWARE. 2186be9a04SYue Hin Lau * 2286be9a04SYue Hin Lau * Authors: AMD 2386be9a04SYue Hin Lau * 2486be9a04SYue Hin Lau */ 2586be9a04SYue Hin Lau #include "dm_services.h" 2686be9a04SYue Hin Lau #include "dce_calcs.h" 2786be9a04SYue Hin Lau #include "reg_helper.h" 2886be9a04SYue Hin Lau #include "basics/conversion.h" 2986be9a04SYue Hin Lau #include "dcn10_hubp.h" 3086be9a04SYue Hin Lau 3186be9a04SYue Hin Lau #define REG(reg)\ 32c42c275cSYue Hin Lau hubp1->hubp_regs->reg 3386be9a04SYue Hin Lau 3486be9a04SYue Hin Lau #define CTX \ 3586be9a04SYue Hin Lau hubp1->base.ctx 3686be9a04SYue Hin Lau 3786be9a04SYue Hin Lau #undef FN 3886be9a04SYue Hin Lau #define FN(reg_name, field_name) \ 39c42c275cSYue Hin Lau hubp1->hubp_shift->field_name, hubp1->hubp_mask->field_name 4086be9a04SYue Hin Lau 4186be9a04SYue Hin Lau void hubp1_set_blank(struct hubp *hubp, bool blank) 4286be9a04SYue Hin Lau { 4386be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 4486be9a04SYue Hin Lau uint32_t blank_en = blank ? 1 : 0; 4586be9a04SYue Hin Lau 4675c2dec3STony Cheng REG_UPDATE_2(DCHUBP_CNTL, 4786be9a04SYue Hin Lau HUBP_BLANK_EN, blank_en, 4886be9a04SYue Hin Lau HUBP_TTU_DISABLE, blank_en); 4986be9a04SYue Hin Lau 5086be9a04SYue Hin Lau if (blank) { 5175c2dec3STony Cheng uint32_t reg_val = REG_READ(DCHUBP_CNTL); 5275c2dec3STony Cheng 53cc55b1f5STony Cheng if (reg_val) { 54cc55b1f5STony Cheng /* init sequence workaround: in case HUBP is 55cc55b1f5STony Cheng * power gated, this wait would timeout. 56cc55b1f5STony Cheng * 57cc55b1f5STony Cheng * we just wrote reg_val to non-0, if it stay 0 58cc55b1f5STony Cheng * it means HUBP is gated 59cc55b1f5STony Cheng */ 6086be9a04SYue Hin Lau REG_WAIT(DCHUBP_CNTL, 6186be9a04SYue Hin Lau HUBP_NO_OUTSTANDING_REQ, 1, 6286be9a04SYue Hin Lau 1, 200); 63cc55b1f5STony Cheng } 64cc55b1f5STony Cheng 6586be9a04SYue Hin Lau hubp->mpcc_id = 0xf; 6686be9a04SYue Hin Lau hubp->opp_id = 0xf; 6786be9a04SYue Hin Lau } 6886be9a04SYue Hin Lau } 6986be9a04SYue Hin Lau 701dbac201SYongqiang Sun static void hubp1_disconnect(struct hubp *hubp) 711dbac201SYongqiang Sun { 721dbac201SYongqiang Sun struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 731dbac201SYongqiang Sun 741dbac201SYongqiang Sun REG_UPDATE(DCHUBP_CNTL, 751dbac201SYongqiang Sun HUBP_TTU_DISABLE, 1); 765af9d013SEric Yang 775af9d013SEric Yang REG_UPDATE(CURSOR_CONTROL, 785af9d013SEric Yang CURSOR_ENABLE, 0); 791dbac201SYongqiang Sun } 801dbac201SYongqiang Sun 813ba43a59SCharlene Liu static void hubp1_disable_control(struct hubp *hubp, bool disable_hubp) 823ba43a59SCharlene Liu { 833ba43a59SCharlene Liu struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 843ba43a59SCharlene Liu uint32_t disable = disable_hubp ? 1 : 0; 853ba43a59SCharlene Liu 863ba43a59SCharlene Liu REG_UPDATE(DCHUBP_CNTL, 873ba43a59SCharlene Liu HUBP_DISABLE, disable); 883ba43a59SCharlene Liu } 893ba43a59SCharlene Liu 903ba43a59SCharlene Liu static unsigned int hubp1_get_underflow_status(struct hubp *hubp) 913ba43a59SCharlene Liu { 923ba43a59SCharlene Liu uint32_t hubp_underflow = 0; 933ba43a59SCharlene Liu struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 943ba43a59SCharlene Liu 953ba43a59SCharlene Liu REG_GET(DCHUBP_CNTL, 963ba43a59SCharlene Liu HUBP_UNDERFLOW_STATUS, 973ba43a59SCharlene Liu &hubp_underflow); 983ba43a59SCharlene Liu 993ba43a59SCharlene Liu return hubp_underflow; 1003ba43a59SCharlene Liu } 1013ba43a59SCharlene Liu 102eb6b29d6SJun Lei 103eb6b29d6SJun Lei void hubp1_clear_underflow(struct hubp *hubp) 104eb6b29d6SJun Lei { 105eb6b29d6SJun Lei struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 106eb6b29d6SJun Lei 107eb6b29d6SJun Lei REG_UPDATE(DCHUBP_CNTL, HUBP_UNDERFLOW_CLEAR, 1); 108eb6b29d6SJun Lei } 109eb6b29d6SJun Lei 11086be9a04SYue Hin Lau static void hubp1_set_hubp_blank_en(struct hubp *hubp, bool blank) 11186be9a04SYue Hin Lau { 11286be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 11386be9a04SYue Hin Lau uint32_t blank_en = blank ? 1 : 0; 11486be9a04SYue Hin Lau 11586be9a04SYue Hin Lau REG_UPDATE(DCHUBP_CNTL, HUBP_BLANK_EN, blank_en); 11686be9a04SYue Hin Lau } 11786be9a04SYue Hin Lau 11886be9a04SYue Hin Lau static void hubp1_vready_workaround(struct hubp *hubp, 11986be9a04SYue Hin Lau struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest) 12086be9a04SYue Hin Lau { 12186be9a04SYue Hin Lau uint32_t value = 0; 12286be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 12386be9a04SYue Hin Lau 12486be9a04SYue Hin Lau /* set HBUBREQ_DEBUG_DB[12] = 1 */ 12586be9a04SYue Hin Lau value = REG_READ(HUBPREQ_DEBUG_DB); 12686be9a04SYue Hin Lau 12786be9a04SYue Hin Lau /* hack mode disable */ 12886be9a04SYue Hin Lau value |= 0x100; 12986be9a04SYue Hin Lau value &= ~0x1000; 13086be9a04SYue Hin Lau 13186be9a04SYue Hin Lau if ((pipe_dest->vstartup_start - 2*(pipe_dest->vready_offset+pipe_dest->vupdate_width 13286be9a04SYue Hin Lau + pipe_dest->vupdate_offset) / pipe_dest->htotal) <= pipe_dest->vblank_end) { 13386be9a04SYue Hin Lau /* if (eco_fix_needed(otg_global_sync_timing) 13486be9a04SYue Hin Lau * set HBUBREQ_DEBUG_DB[12] = 1 */ 13586be9a04SYue Hin Lau value |= 0x1000; 13686be9a04SYue Hin Lau } 13786be9a04SYue Hin Lau 13886be9a04SYue Hin Lau REG_WRITE(HUBPREQ_DEBUG_DB, value); 13986be9a04SYue Hin Lau } 14086be9a04SYue Hin Lau 14186be9a04SYue Hin Lau void hubp1_program_tiling( 1424b8240bfSYue Hin Lau struct hubp *hubp, 14386be9a04SYue Hin Lau const union dc_tiling_info *info, 14486be9a04SYue Hin Lau const enum surface_pixel_format pixel_format) 14586be9a04SYue Hin Lau { 1464b8240bfSYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 1474b8240bfSYue Hin Lau 14886be9a04SYue Hin Lau REG_UPDATE_6(DCSURF_ADDR_CONFIG, 14986be9a04SYue Hin Lau NUM_PIPES, log_2(info->gfx9.num_pipes), 15086be9a04SYue Hin Lau NUM_BANKS, log_2(info->gfx9.num_banks), 15186be9a04SYue Hin Lau PIPE_INTERLEAVE, info->gfx9.pipe_interleave, 15286be9a04SYue Hin Lau NUM_SE, log_2(info->gfx9.num_shader_engines), 15386be9a04SYue Hin Lau NUM_RB_PER_SE, log_2(info->gfx9.num_rb_per_se), 15486be9a04SYue Hin Lau MAX_COMPRESSED_FRAGS, log_2(info->gfx9.max_compressed_frags)); 15586be9a04SYue Hin Lau 15686be9a04SYue Hin Lau REG_UPDATE_4(DCSURF_TILING_CONFIG, 15786be9a04SYue Hin Lau SW_MODE, info->gfx9.swizzle, 15886be9a04SYue Hin Lau META_LINEAR, info->gfx9.meta_linear, 15986be9a04SYue Hin Lau RB_ALIGNED, info->gfx9.rb_aligned, 16086be9a04SYue Hin Lau PIPE_ALIGNED, info->gfx9.pipe_aligned); 16186be9a04SYue Hin Lau } 16286be9a04SYue Hin Lau 163a9962fb8SEric Bernstein void hubp1_program_size( 1644b8240bfSYue Hin Lau struct hubp *hubp, 16586be9a04SYue Hin Lau enum surface_pixel_format format, 16686be9a04SYue Hin Lau const union plane_size *plane_size, 167a9962fb8SEric Bernstein struct dc_plane_dcc_param *dcc) 16886be9a04SYue Hin Lau { 1694b8240bfSYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 170a9962fb8SEric Bernstein uint32_t pitch, meta_pitch, pitch_c, meta_pitch_c; 17186be9a04SYue Hin Lau 17286be9a04SYue Hin Lau /* Program data and meta surface pitch (calculation from addrlib) 17386be9a04SYue Hin Lau * 444 or 420 luma 17486be9a04SYue Hin Lau */ 175836758ffSZheng, XueLai(Eric) if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN && format < SURFACE_PIXEL_FORMAT_SUBSAMPLE_END) { 1768ec06a17SJulian Parkin ASSERT(plane_size->video.chroma_pitch != 0); 1778ec06a17SJulian Parkin /* Chroma pitch zero can cause system hang! */ 1788ec06a17SJulian Parkin 17986be9a04SYue Hin Lau pitch = plane_size->video.luma_pitch - 1; 18086be9a04SYue Hin Lau meta_pitch = dcc->video.meta_pitch_l - 1; 18186be9a04SYue Hin Lau pitch_c = plane_size->video.chroma_pitch - 1; 18286be9a04SYue Hin Lau meta_pitch_c = dcc->video.meta_pitch_c - 1; 18386be9a04SYue Hin Lau } else { 18486be9a04SYue Hin Lau pitch = plane_size->grph.surface_pitch - 1; 18586be9a04SYue Hin Lau meta_pitch = dcc->grph.meta_pitch - 1; 18686be9a04SYue Hin Lau pitch_c = 0; 18786be9a04SYue Hin Lau meta_pitch_c = 0; 18886be9a04SYue Hin Lau } 18986be9a04SYue Hin Lau 19086be9a04SYue Hin Lau if (!dcc->enable) { 19186be9a04SYue Hin Lau meta_pitch = 0; 19286be9a04SYue Hin Lau meta_pitch_c = 0; 19386be9a04SYue Hin Lau } 19486be9a04SYue Hin Lau 19586be9a04SYue Hin Lau REG_UPDATE_2(DCSURF_SURFACE_PITCH, 19686be9a04SYue Hin Lau PITCH, pitch, META_PITCH, meta_pitch); 19786be9a04SYue Hin Lau 19886be9a04SYue Hin Lau if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) 19986be9a04SYue Hin Lau REG_UPDATE_2(DCSURF_SURFACE_PITCH_C, 20086be9a04SYue Hin Lau PITCH_C, pitch_c, META_PITCH_C, meta_pitch_c); 201a9962fb8SEric Bernstein } 202a9962fb8SEric Bernstein 203a9962fb8SEric Bernstein void hubp1_program_rotation( 204a9962fb8SEric Bernstein struct hubp *hubp, 205a9962fb8SEric Bernstein enum dc_rotation_angle rotation, 206a9962fb8SEric Bernstein bool horizontal_mirror) 207a9962fb8SEric Bernstein { 208a9962fb8SEric Bernstein struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 209a9962fb8SEric Bernstein uint32_t mirror; 210a9962fb8SEric Bernstein 21186be9a04SYue Hin Lau 21286be9a04SYue Hin Lau if (horizontal_mirror) 21386be9a04SYue Hin Lau mirror = 1; 21486be9a04SYue Hin Lau else 21586be9a04SYue Hin Lau mirror = 0; 21686be9a04SYue Hin Lau 21786be9a04SYue Hin Lau /* Program rotation angle and horz mirror - no mirror */ 21886be9a04SYue Hin Lau if (rotation == ROTATION_ANGLE_0) 21986be9a04SYue Hin Lau REG_UPDATE_2(DCSURF_SURFACE_CONFIG, 22086be9a04SYue Hin Lau ROTATION_ANGLE, 0, 22186be9a04SYue Hin Lau H_MIRROR_EN, mirror); 22286be9a04SYue Hin Lau else if (rotation == ROTATION_ANGLE_90) 22386be9a04SYue Hin Lau REG_UPDATE_2(DCSURF_SURFACE_CONFIG, 22486be9a04SYue Hin Lau ROTATION_ANGLE, 1, 22586be9a04SYue Hin Lau H_MIRROR_EN, mirror); 22686be9a04SYue Hin Lau else if (rotation == ROTATION_ANGLE_180) 22786be9a04SYue Hin Lau REG_UPDATE_2(DCSURF_SURFACE_CONFIG, 22886be9a04SYue Hin Lau ROTATION_ANGLE, 2, 22986be9a04SYue Hin Lau H_MIRROR_EN, mirror); 23086be9a04SYue Hin Lau else if (rotation == ROTATION_ANGLE_270) 23186be9a04SYue Hin Lau REG_UPDATE_2(DCSURF_SURFACE_CONFIG, 23286be9a04SYue Hin Lau ROTATION_ANGLE, 3, 23386be9a04SYue Hin Lau H_MIRROR_EN, mirror); 23486be9a04SYue Hin Lau } 23586be9a04SYue Hin Lau 23686be9a04SYue Hin Lau void hubp1_program_pixel_format( 2374b8240bfSYue Hin Lau struct hubp *hubp, 23886be9a04SYue Hin Lau enum surface_pixel_format format) 23986be9a04SYue Hin Lau { 2404b8240bfSYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 24186be9a04SYue Hin Lau uint32_t red_bar = 3; 24286be9a04SYue Hin Lau uint32_t blue_bar = 2; 24386be9a04SYue Hin Lau 24486be9a04SYue Hin Lau /* swap for ABGR format */ 24586be9a04SYue Hin Lau if (format == SURFACE_PIXEL_FORMAT_GRPH_ABGR8888 24686be9a04SYue Hin Lau || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010 24786be9a04SYue Hin Lau || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS 24886be9a04SYue Hin Lau || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) { 24986be9a04SYue Hin Lau red_bar = 2; 25086be9a04SYue Hin Lau blue_bar = 3; 25186be9a04SYue Hin Lau } 25286be9a04SYue Hin Lau 25386be9a04SYue Hin Lau REG_UPDATE_2(HUBPRET_CONTROL, 25486be9a04SYue Hin Lau CROSSBAR_SRC_CB_B, blue_bar, 25586be9a04SYue Hin Lau CROSSBAR_SRC_CR_R, red_bar); 25686be9a04SYue Hin Lau 25786be9a04SYue Hin Lau /* Mapping is same as ipp programming (cnvc) */ 25886be9a04SYue Hin Lau 25986be9a04SYue Hin Lau switch (format) { 26086be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: 26186be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 26286be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 1); 26386be9a04SYue Hin Lau break; 26486be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_RGB565: 26586be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 26686be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 3); 26786be9a04SYue Hin Lau break; 26886be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: 26986be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: 27086be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 27186be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 8); 27286be9a04SYue Hin Lau break; 27386be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: 27486be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: 27586be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS: 27686be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 27786be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 10); 27886be9a04SYue Hin Lau break; 27986be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 28086be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 28186be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 22); 28286be9a04SYue Hin Lau break; 28386be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 28486be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:/*we use crossbar already*/ 28586be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 28686be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 24); 28786be9a04SYue Hin Lau break; 28886be9a04SYue Hin Lau 28986be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: 29086be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 29186be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 65); 29286be9a04SYue Hin Lau break; 29386be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb: 29486be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 29586be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 64); 29686be9a04SYue Hin Lau break; 29786be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr: 29886be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 29986be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 67); 30086be9a04SYue Hin Lau break; 30186be9a04SYue Hin Lau case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb: 30286be9a04SYue Hin Lau REG_UPDATE(DCSURF_SURFACE_CONFIG, 30386be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, 66); 30486be9a04SYue Hin Lau break; 3053fc9fc4cSvikrant mhaske case SURFACE_PIXEL_FORMAT_VIDEO_AYCrCb8888: 3063fc9fc4cSvikrant mhaske REG_UPDATE(DCSURF_SURFACE_CONFIG, 3073fc9fc4cSvikrant mhaske SURFACE_PIXEL_FORMAT, 12); 3083fc9fc4cSvikrant mhaske break; 30986be9a04SYue Hin Lau default: 31086be9a04SYue Hin Lau BREAK_TO_DEBUGGER(); 31186be9a04SYue Hin Lau break; 31286be9a04SYue Hin Lau } 31386be9a04SYue Hin Lau 31486be9a04SYue Hin Lau /* don't see the need of program the xbar in DCN 1.0 */ 31586be9a04SYue Hin Lau } 31686be9a04SYue Hin Lau 31786be9a04SYue Hin Lau bool hubp1_program_surface_flip_and_addr( 31886be9a04SYue Hin Lau struct hubp *hubp, 31986be9a04SYue Hin Lau const struct dc_plane_address *address, 32086be9a04SYue Hin Lau bool flip_immediate) 32186be9a04SYue Hin Lau { 32286be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 32386be9a04SYue Hin Lau 3241336926fSAlvin lee 3251336926fSAlvin lee //program flip type 3261336926fSAlvin lee REG_UPDATE(DCSURF_FLIP_CONTROL, 32786be9a04SYue Hin Lau SURFACE_FLIP_TYPE, flip_immediate); 32886be9a04SYue Hin Lau 3291336926fSAlvin lee 3301336926fSAlvin lee if (address->type == PLN_ADDR_TYPE_GRPH_STEREO) { 3311336926fSAlvin lee REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_MODE_FOR_STEREOSYNC, 0x1); 3321336926fSAlvin lee REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_IN_STEREOSYNC, 0x1); 3331336926fSAlvin lee 3341336926fSAlvin lee } else { 3351336926fSAlvin lee // turn off stereo if not in stereo 3361336926fSAlvin lee REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_MODE_FOR_STEREOSYNC, 0x0); 3371336926fSAlvin lee REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_IN_STEREOSYNC, 0x0); 3381336926fSAlvin lee } 3391336926fSAlvin lee 3401336926fSAlvin lee 3411336926fSAlvin lee 34286be9a04SYue Hin Lau /* HW automatically latch rest of address register on write to 34386be9a04SYue Hin Lau * DCSURF_PRIMARY_SURFACE_ADDRESS if SURFACE_UPDATE_LOCK is not used 34486be9a04SYue Hin Lau * 34586be9a04SYue Hin Lau * program high first and then the low addr, order matters! 34686be9a04SYue Hin Lau */ 34786be9a04SYue Hin Lau switch (address->type) { 34886be9a04SYue Hin Lau case PLN_ADDR_TYPE_GRAPHICS: 34986be9a04SYue Hin Lau /* DCN1.0 does not support const color 35086be9a04SYue Hin Lau * TODO: program DCHUBBUB_RET_PATH_DCC_CFGx_0/1 35186be9a04SYue Hin Lau * base on address->grph.dcc_const_color 35286be9a04SYue Hin Lau * x = 0, 2, 4, 6 for pipe 0, 1, 2, 3 for rgb and luma 35386be9a04SYue Hin Lau * x = 1, 3, 5, 7 for pipe 0, 1, 2, 3 for chroma 35486be9a04SYue Hin Lau */ 35586be9a04SYue Hin Lau 35686be9a04SYue Hin Lau if (address->grph.addr.quad_part == 0) 35786be9a04SYue Hin Lau break; 35886be9a04SYue Hin Lau 359cf8c19a3SYongqiang Sun REG_UPDATE_2(DCSURF_SURFACE_CONTROL, 360cf8c19a3SYongqiang Sun PRIMARY_SURFACE_TMZ, address->tmz_surface, 361cf8c19a3SYongqiang Sun PRIMARY_META_SURFACE_TMZ, address->tmz_surface); 36286be9a04SYue Hin Lau 36386be9a04SYue Hin Lau if (address->grph.meta_addr.quad_part != 0) { 36486be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, 0, 36586be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS_HIGH, 36686be9a04SYue Hin Lau address->grph.meta_addr.high_part); 36786be9a04SYue Hin Lau 36886be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS, 0, 36986be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS, 37086be9a04SYue Hin Lau address->grph.meta_addr.low_part); 37186be9a04SYue Hin Lau } 37286be9a04SYue Hin Lau 37386be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, 0, 37486be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS_HIGH, 37586be9a04SYue Hin Lau address->grph.addr.high_part); 37686be9a04SYue Hin Lau 37786be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS, 0, 37886be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS, 37986be9a04SYue Hin Lau address->grph.addr.low_part); 38086be9a04SYue Hin Lau break; 38186be9a04SYue Hin Lau case PLN_ADDR_TYPE_VIDEO_PROGRESSIVE: 38286be9a04SYue Hin Lau if (address->video_progressive.luma_addr.quad_part == 0 38386be9a04SYue Hin Lau || address->video_progressive.chroma_addr.quad_part == 0) 38486be9a04SYue Hin Lau break; 38586be9a04SYue Hin Lau 386cf8c19a3SYongqiang Sun REG_UPDATE_4(DCSURF_SURFACE_CONTROL, 387cf8c19a3SYongqiang Sun PRIMARY_SURFACE_TMZ, address->tmz_surface, 388cf8c19a3SYongqiang Sun PRIMARY_SURFACE_TMZ_C, address->tmz_surface, 389cf8c19a3SYongqiang Sun PRIMARY_META_SURFACE_TMZ, address->tmz_surface, 390cf8c19a3SYongqiang Sun PRIMARY_META_SURFACE_TMZ_C, address->tmz_surface); 39186be9a04SYue Hin Lau 39286be9a04SYue Hin Lau if (address->video_progressive.luma_meta_addr.quad_part != 0) { 39386be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH_C, 0, 39486be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS_HIGH_C, 39586be9a04SYue Hin Lau address->video_progressive.chroma_meta_addr.high_part); 39686be9a04SYue Hin Lau 39786be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS_C, 0, 39886be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS_C, 39986be9a04SYue Hin Lau address->video_progressive.chroma_meta_addr.low_part); 40086be9a04SYue Hin Lau 40186be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, 0, 40286be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS_HIGH, 40386be9a04SYue Hin Lau address->video_progressive.luma_meta_addr.high_part); 40486be9a04SYue Hin Lau 40586be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS, 0, 40686be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS, 40786be9a04SYue Hin Lau address->video_progressive.luma_meta_addr.low_part); 40886be9a04SYue Hin Lau } 40986be9a04SYue Hin Lau 41086be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C, 0, 41186be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS_HIGH_C, 41286be9a04SYue Hin Lau address->video_progressive.chroma_addr.high_part); 41386be9a04SYue Hin Lau 41486be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS_C, 0, 41586be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS_C, 41686be9a04SYue Hin Lau address->video_progressive.chroma_addr.low_part); 41786be9a04SYue Hin Lau 41886be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, 0, 41986be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS_HIGH, 42086be9a04SYue Hin Lau address->video_progressive.luma_addr.high_part); 42186be9a04SYue Hin Lau 42286be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS, 0, 42386be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS, 42486be9a04SYue Hin Lau address->video_progressive.luma_addr.low_part); 42586be9a04SYue Hin Lau break; 42686be9a04SYue Hin Lau case PLN_ADDR_TYPE_GRPH_STEREO: 42786be9a04SYue Hin Lau if (address->grph_stereo.left_addr.quad_part == 0) 42886be9a04SYue Hin Lau break; 42986be9a04SYue Hin Lau if (address->grph_stereo.right_addr.quad_part == 0) 43086be9a04SYue Hin Lau break; 43186be9a04SYue Hin Lau 432aa6d4a59SEric Bernstein REG_UPDATE_8(DCSURF_SURFACE_CONTROL, 433cf8c19a3SYongqiang Sun PRIMARY_SURFACE_TMZ, address->tmz_surface, 434cf8c19a3SYongqiang Sun PRIMARY_SURFACE_TMZ_C, address->tmz_surface, 435cf8c19a3SYongqiang Sun PRIMARY_META_SURFACE_TMZ, address->tmz_surface, 436aa6d4a59SEric Bernstein PRIMARY_META_SURFACE_TMZ_C, address->tmz_surface, 437aa6d4a59SEric Bernstein SECONDARY_SURFACE_TMZ, address->tmz_surface, 438aa6d4a59SEric Bernstein SECONDARY_SURFACE_TMZ_C, address->tmz_surface, 439aa6d4a59SEric Bernstein SECONDARY_META_SURFACE_TMZ, address->tmz_surface, 440aa6d4a59SEric Bernstein SECONDARY_META_SURFACE_TMZ_C, address->tmz_surface); 44186be9a04SYue Hin Lau 44286be9a04SYue Hin Lau if (address->grph_stereo.right_meta_addr.quad_part != 0) { 44386be9a04SYue Hin Lau 44486be9a04SYue Hin Lau REG_SET(DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH, 0, 44586be9a04SYue Hin Lau SECONDARY_META_SURFACE_ADDRESS_HIGH, 44686be9a04SYue Hin Lau address->grph_stereo.right_meta_addr.high_part); 44786be9a04SYue Hin Lau 44886be9a04SYue Hin Lau REG_SET(DCSURF_SECONDARY_META_SURFACE_ADDRESS, 0, 44986be9a04SYue Hin Lau SECONDARY_META_SURFACE_ADDRESS, 45086be9a04SYue Hin Lau address->grph_stereo.right_meta_addr.low_part); 45186be9a04SYue Hin Lau } 45286be9a04SYue Hin Lau if (address->grph_stereo.left_meta_addr.quad_part != 0) { 45386be9a04SYue Hin Lau 45486be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, 0, 45586be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS_HIGH, 45686be9a04SYue Hin Lau address->grph_stereo.left_meta_addr.high_part); 45786be9a04SYue Hin Lau 45886be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_META_SURFACE_ADDRESS, 0, 45986be9a04SYue Hin Lau PRIMARY_META_SURFACE_ADDRESS, 46086be9a04SYue Hin Lau address->grph_stereo.left_meta_addr.low_part); 46186be9a04SYue Hin Lau } 46286be9a04SYue Hin Lau 46386be9a04SYue Hin Lau REG_SET(DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH, 0, 46486be9a04SYue Hin Lau SECONDARY_SURFACE_ADDRESS_HIGH, 46586be9a04SYue Hin Lau address->grph_stereo.right_addr.high_part); 46686be9a04SYue Hin Lau 46786be9a04SYue Hin Lau REG_SET(DCSURF_SECONDARY_SURFACE_ADDRESS, 0, 46886be9a04SYue Hin Lau SECONDARY_SURFACE_ADDRESS, 46986be9a04SYue Hin Lau address->grph_stereo.right_addr.low_part); 47086be9a04SYue Hin Lau 47186be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, 0, 47286be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS_HIGH, 47386be9a04SYue Hin Lau address->grph_stereo.left_addr.high_part); 47486be9a04SYue Hin Lau 47586be9a04SYue Hin Lau REG_SET(DCSURF_PRIMARY_SURFACE_ADDRESS, 0, 47686be9a04SYue Hin Lau PRIMARY_SURFACE_ADDRESS, 47786be9a04SYue Hin Lau address->grph_stereo.left_addr.low_part); 47886be9a04SYue Hin Lau break; 47986be9a04SYue Hin Lau default: 48086be9a04SYue Hin Lau BREAK_TO_DEBUGGER(); 48186be9a04SYue Hin Lau break; 48286be9a04SYue Hin Lau } 48386be9a04SYue Hin Lau 48486be9a04SYue Hin Lau hubp->request_address = *address; 48586be9a04SYue Hin Lau 48686be9a04SYue Hin Lau return true; 48786be9a04SYue Hin Lau } 48886be9a04SYue Hin Lau 48986be9a04SYue Hin Lau void hubp1_dcc_control(struct hubp *hubp, bool enable, 49086be9a04SYue Hin Lau bool independent_64b_blks) 49186be9a04SYue Hin Lau { 49286be9a04SYue Hin Lau uint32_t dcc_en = enable ? 1 : 0; 49386be9a04SYue Hin Lau uint32_t dcc_ind_64b_blk = independent_64b_blks ? 1 : 0; 49486be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 49586be9a04SYue Hin Lau 496aa6d4a59SEric Bernstein REG_UPDATE_4(DCSURF_SURFACE_CONTROL, 49786be9a04SYue Hin Lau PRIMARY_SURFACE_DCC_EN, dcc_en, 498aa6d4a59SEric Bernstein PRIMARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk, 499aa6d4a59SEric Bernstein SECONDARY_SURFACE_DCC_EN, dcc_en, 500aa6d4a59SEric Bernstein SECONDARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk); 50186be9a04SYue Hin Lau } 50286be9a04SYue Hin Lau 50386be9a04SYue Hin Lau void hubp1_program_surface_config( 50486be9a04SYue Hin Lau struct hubp *hubp, 50586be9a04SYue Hin Lau enum surface_pixel_format format, 50686be9a04SYue Hin Lau union dc_tiling_info *tiling_info, 50786be9a04SYue Hin Lau union plane_size *plane_size, 50886be9a04SYue Hin Lau enum dc_rotation_angle rotation, 50986be9a04SYue Hin Lau struct dc_plane_dcc_param *dcc, 510a465feaeSCharlene Liu bool horizontal_mirror, 511a465feaeSCharlene Liu unsigned int compat_level) 51286be9a04SYue Hin Lau { 51386be9a04SYue Hin Lau hubp1_dcc_control(hubp, dcc->enable, dcc->grph.independent_64b_blks); 5144b8240bfSYue Hin Lau hubp1_program_tiling(hubp, tiling_info, format); 515a9962fb8SEric Bernstein hubp1_program_size(hubp, format, plane_size, dcc); 516a9962fb8SEric Bernstein hubp1_program_rotation(hubp, rotation, horizontal_mirror); 5174b8240bfSYue Hin Lau hubp1_program_pixel_format(hubp, format); 51886be9a04SYue Hin Lau } 51986be9a04SYue Hin Lau 52086be9a04SYue Hin Lau void hubp1_program_requestor( 52186be9a04SYue Hin Lau struct hubp *hubp, 52286be9a04SYue Hin Lau struct _vcs_dpi_display_rq_regs_st *rq_regs) 52386be9a04SYue Hin Lau { 52486be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 52586be9a04SYue Hin Lau 52686be9a04SYue Hin Lau REG_UPDATE(HUBPRET_CONTROL, 52786be9a04SYue Hin Lau DET_BUF_PLANE1_BASE_ADDRESS, rq_regs->plane1_base_address); 52886be9a04SYue Hin Lau REG_SET_4(DCN_EXPANSION_MODE, 0, 52986be9a04SYue Hin Lau DRQ_EXPANSION_MODE, rq_regs->drq_expansion_mode, 53086be9a04SYue Hin Lau PRQ_EXPANSION_MODE, rq_regs->prq_expansion_mode, 53186be9a04SYue Hin Lau MRQ_EXPANSION_MODE, rq_regs->mrq_expansion_mode, 53286be9a04SYue Hin Lau CRQ_EXPANSION_MODE, rq_regs->crq_expansion_mode); 53386be9a04SYue Hin Lau REG_SET_8(DCHUBP_REQ_SIZE_CONFIG, 0, 53486be9a04SYue Hin Lau CHUNK_SIZE, rq_regs->rq_regs_l.chunk_size, 53586be9a04SYue Hin Lau MIN_CHUNK_SIZE, rq_regs->rq_regs_l.min_chunk_size, 53686be9a04SYue Hin Lau META_CHUNK_SIZE, rq_regs->rq_regs_l.meta_chunk_size, 53786be9a04SYue Hin Lau MIN_META_CHUNK_SIZE, rq_regs->rq_regs_l.min_meta_chunk_size, 53886be9a04SYue Hin Lau DPTE_GROUP_SIZE, rq_regs->rq_regs_l.dpte_group_size, 53986be9a04SYue Hin Lau MPTE_GROUP_SIZE, rq_regs->rq_regs_l.mpte_group_size, 54086be9a04SYue Hin Lau SWATH_HEIGHT, rq_regs->rq_regs_l.swath_height, 54186be9a04SYue Hin Lau PTE_ROW_HEIGHT_LINEAR, rq_regs->rq_regs_l.pte_row_height_linear); 54286be9a04SYue Hin Lau REG_SET_8(DCHUBP_REQ_SIZE_CONFIG_C, 0, 54386be9a04SYue Hin Lau CHUNK_SIZE_C, rq_regs->rq_regs_c.chunk_size, 54486be9a04SYue Hin Lau MIN_CHUNK_SIZE_C, rq_regs->rq_regs_c.min_chunk_size, 54586be9a04SYue Hin Lau META_CHUNK_SIZE_C, rq_regs->rq_regs_c.meta_chunk_size, 54686be9a04SYue Hin Lau MIN_META_CHUNK_SIZE_C, rq_regs->rq_regs_c.min_meta_chunk_size, 54786be9a04SYue Hin Lau DPTE_GROUP_SIZE_C, rq_regs->rq_regs_c.dpte_group_size, 54886be9a04SYue Hin Lau MPTE_GROUP_SIZE_C, rq_regs->rq_regs_c.mpte_group_size, 54986be9a04SYue Hin Lau SWATH_HEIGHT_C, rq_regs->rq_regs_c.swath_height, 55086be9a04SYue Hin Lau PTE_ROW_HEIGHT_LINEAR_C, rq_regs->rq_regs_c.pte_row_height_linear); 55186be9a04SYue Hin Lau } 55286be9a04SYue Hin Lau 55386be9a04SYue Hin Lau 55486be9a04SYue Hin Lau void hubp1_program_deadline( 55586be9a04SYue Hin Lau struct hubp *hubp, 55686be9a04SYue Hin Lau struct _vcs_dpi_display_dlg_regs_st *dlg_attr, 55786be9a04SYue Hin Lau struct _vcs_dpi_display_ttu_regs_st *ttu_attr) 55886be9a04SYue Hin Lau { 55986be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 56086be9a04SYue Hin Lau 56186be9a04SYue Hin Lau /* DLG - Per hubp */ 56286be9a04SYue Hin Lau REG_SET_2(BLANK_OFFSET_0, 0, 56386be9a04SYue Hin Lau REFCYC_H_BLANK_END, dlg_attr->refcyc_h_blank_end, 56486be9a04SYue Hin Lau DLG_V_BLANK_END, dlg_attr->dlg_vblank_end); 56586be9a04SYue Hin Lau 56686be9a04SYue Hin Lau REG_SET(BLANK_OFFSET_1, 0, 56786be9a04SYue Hin Lau MIN_DST_Y_NEXT_START, dlg_attr->min_dst_y_next_start); 56886be9a04SYue Hin Lau 56986be9a04SYue Hin Lau REG_SET(DST_DIMENSIONS, 0, 57086be9a04SYue Hin Lau REFCYC_PER_HTOTAL, dlg_attr->refcyc_per_htotal); 57186be9a04SYue Hin Lau 57286be9a04SYue Hin Lau REG_SET_2(DST_AFTER_SCALER, 0, 57386be9a04SYue Hin Lau REFCYC_X_AFTER_SCALER, dlg_attr->refcyc_x_after_scaler, 57486be9a04SYue Hin Lau DST_Y_AFTER_SCALER, dlg_attr->dst_y_after_scaler); 57586be9a04SYue Hin Lau 57686be9a04SYue Hin Lau if (REG(PREFETCH_SETTINS)) 57786be9a04SYue Hin Lau REG_SET_2(PREFETCH_SETTINS, 0, 57886be9a04SYue Hin Lau DST_Y_PREFETCH, dlg_attr->dst_y_prefetch, 57986be9a04SYue Hin Lau VRATIO_PREFETCH, dlg_attr->vratio_prefetch); 58086be9a04SYue Hin Lau else 58186be9a04SYue Hin Lau REG_SET_2(PREFETCH_SETTINGS, 0, 58286be9a04SYue Hin Lau DST_Y_PREFETCH, dlg_attr->dst_y_prefetch, 58386be9a04SYue Hin Lau VRATIO_PREFETCH, dlg_attr->vratio_prefetch); 58486be9a04SYue Hin Lau 58586be9a04SYue Hin Lau REG_SET_2(VBLANK_PARAMETERS_0, 0, 58686be9a04SYue Hin Lau DST_Y_PER_VM_VBLANK, dlg_attr->dst_y_per_vm_vblank, 58786be9a04SYue Hin Lau DST_Y_PER_ROW_VBLANK, dlg_attr->dst_y_per_row_vblank); 58886be9a04SYue Hin Lau 58986be9a04SYue Hin Lau REG_SET(REF_FREQ_TO_PIX_FREQ, 0, 59086be9a04SYue Hin Lau REF_FREQ_TO_PIX_FREQ, dlg_attr->ref_freq_to_pix_freq); 59186be9a04SYue Hin Lau 59286be9a04SYue Hin Lau /* DLG - Per luma/chroma */ 59386be9a04SYue Hin Lau REG_SET(VBLANK_PARAMETERS_1, 0, 59486be9a04SYue Hin Lau REFCYC_PER_PTE_GROUP_VBLANK_L, dlg_attr->refcyc_per_pte_group_vblank_l); 59586be9a04SYue Hin Lau 59686be9a04SYue Hin Lau REG_SET(VBLANK_PARAMETERS_3, 0, 59786be9a04SYue Hin Lau REFCYC_PER_META_CHUNK_VBLANK_L, dlg_attr->refcyc_per_meta_chunk_vblank_l); 59886be9a04SYue Hin Lau 599b552204bSNikola Cornij if (REG(NOM_PARAMETERS_0)) 60086be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_0, 0, 60186be9a04SYue Hin Lau DST_Y_PER_PTE_ROW_NOM_L, dlg_attr->dst_y_per_pte_row_nom_l); 60286be9a04SYue Hin Lau 603b552204bSNikola Cornij if (REG(NOM_PARAMETERS_1)) 60486be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_1, 0, 60586be9a04SYue Hin Lau REFCYC_PER_PTE_GROUP_NOM_L, dlg_attr->refcyc_per_pte_group_nom_l); 60686be9a04SYue Hin Lau 60786be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_4, 0, 60886be9a04SYue Hin Lau DST_Y_PER_META_ROW_NOM_L, dlg_attr->dst_y_per_meta_row_nom_l); 60986be9a04SYue Hin Lau 61086be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_5, 0, 61186be9a04SYue Hin Lau REFCYC_PER_META_CHUNK_NOM_L, dlg_attr->refcyc_per_meta_chunk_nom_l); 61286be9a04SYue Hin Lau 61386be9a04SYue Hin Lau REG_SET_2(PER_LINE_DELIVERY_PRE, 0, 61486be9a04SYue Hin Lau REFCYC_PER_LINE_DELIVERY_PRE_L, dlg_attr->refcyc_per_line_delivery_pre_l, 61586be9a04SYue Hin Lau REFCYC_PER_LINE_DELIVERY_PRE_C, dlg_attr->refcyc_per_line_delivery_pre_c); 61686be9a04SYue Hin Lau 61786be9a04SYue Hin Lau REG_SET_2(PER_LINE_DELIVERY, 0, 61886be9a04SYue Hin Lau REFCYC_PER_LINE_DELIVERY_L, dlg_attr->refcyc_per_line_delivery_l, 61986be9a04SYue Hin Lau REFCYC_PER_LINE_DELIVERY_C, dlg_attr->refcyc_per_line_delivery_c); 62086be9a04SYue Hin Lau 62186be9a04SYue Hin Lau if (REG(PREFETCH_SETTINS_C)) 62286be9a04SYue Hin Lau REG_SET(PREFETCH_SETTINS_C, 0, 62386be9a04SYue Hin Lau VRATIO_PREFETCH_C, dlg_attr->vratio_prefetch_c); 62486be9a04SYue Hin Lau else 62586be9a04SYue Hin Lau REG_SET(PREFETCH_SETTINGS_C, 0, 62686be9a04SYue Hin Lau VRATIO_PREFETCH_C, dlg_attr->vratio_prefetch_c); 62786be9a04SYue Hin Lau 62886be9a04SYue Hin Lau REG_SET(VBLANK_PARAMETERS_2, 0, 62986be9a04SYue Hin Lau REFCYC_PER_PTE_GROUP_VBLANK_C, dlg_attr->refcyc_per_pte_group_vblank_c); 63086be9a04SYue Hin Lau 63186be9a04SYue Hin Lau REG_SET(VBLANK_PARAMETERS_4, 0, 63286be9a04SYue Hin Lau REFCYC_PER_META_CHUNK_VBLANK_C, dlg_attr->refcyc_per_meta_chunk_vblank_c); 63386be9a04SYue Hin Lau 634b552204bSNikola Cornij if (REG(NOM_PARAMETERS_2)) 63586be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_2, 0, 63686be9a04SYue Hin Lau DST_Y_PER_PTE_ROW_NOM_C, dlg_attr->dst_y_per_pte_row_nom_c); 63786be9a04SYue Hin Lau 638b552204bSNikola Cornij if (REG(NOM_PARAMETERS_3)) 63986be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_3, 0, 64086be9a04SYue Hin Lau REFCYC_PER_PTE_GROUP_NOM_C, dlg_attr->refcyc_per_pte_group_nom_c); 64186be9a04SYue Hin Lau 64286be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_6, 0, 64386be9a04SYue Hin Lau DST_Y_PER_META_ROW_NOM_C, dlg_attr->dst_y_per_meta_row_nom_c); 64486be9a04SYue Hin Lau 64586be9a04SYue Hin Lau REG_SET(NOM_PARAMETERS_7, 0, 64686be9a04SYue Hin Lau REFCYC_PER_META_CHUNK_NOM_C, dlg_attr->refcyc_per_meta_chunk_nom_c); 64786be9a04SYue Hin Lau 64886be9a04SYue Hin Lau /* TTU - per hubp */ 64986be9a04SYue Hin Lau REG_SET_2(DCN_TTU_QOS_WM, 0, 65086be9a04SYue Hin Lau QoS_LEVEL_LOW_WM, ttu_attr->qos_level_low_wm, 65186be9a04SYue Hin Lau QoS_LEVEL_HIGH_WM, ttu_attr->qos_level_high_wm); 65286be9a04SYue Hin Lau 65386be9a04SYue Hin Lau REG_SET_2(DCN_GLOBAL_TTU_CNTL, 0, 65486be9a04SYue Hin Lau MIN_TTU_VBLANK, ttu_attr->min_ttu_vblank, 65586be9a04SYue Hin Lau QoS_LEVEL_FLIP, ttu_attr->qos_level_flip); 65686be9a04SYue Hin Lau 65786be9a04SYue Hin Lau /* TTU - per luma/chroma */ 65886be9a04SYue Hin Lau /* Assumed surf0 is luma and 1 is chroma */ 65986be9a04SYue Hin Lau 66086be9a04SYue Hin Lau REG_SET_3(DCN_SURF0_TTU_CNTL0, 0, 66186be9a04SYue Hin Lau REFCYC_PER_REQ_DELIVERY, ttu_attr->refcyc_per_req_delivery_l, 66286be9a04SYue Hin Lau QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_l, 66386be9a04SYue Hin Lau QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_l); 66486be9a04SYue Hin Lau 66586be9a04SYue Hin Lau REG_SET(DCN_SURF0_TTU_CNTL1, 0, 66686be9a04SYue Hin Lau REFCYC_PER_REQ_DELIVERY_PRE, 66786be9a04SYue Hin Lau ttu_attr->refcyc_per_req_delivery_pre_l); 66886be9a04SYue Hin Lau 66986be9a04SYue Hin Lau REG_SET_3(DCN_SURF1_TTU_CNTL0, 0, 67086be9a04SYue Hin Lau REFCYC_PER_REQ_DELIVERY, ttu_attr->refcyc_per_req_delivery_c, 67186be9a04SYue Hin Lau QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_c, 67286be9a04SYue Hin Lau QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_c); 67386be9a04SYue Hin Lau 67486be9a04SYue Hin Lau REG_SET(DCN_SURF1_TTU_CNTL1, 0, 67586be9a04SYue Hin Lau REFCYC_PER_REQ_DELIVERY_PRE, 67686be9a04SYue Hin Lau ttu_attr->refcyc_per_req_delivery_pre_c); 677c0aceb7dSCharlene Liu 678c0aceb7dSCharlene Liu REG_SET_3(DCN_CUR0_TTU_CNTL0, 0, 679c0aceb7dSCharlene Liu REFCYC_PER_REQ_DELIVERY, ttu_attr->refcyc_per_req_delivery_cur0, 680c0aceb7dSCharlene Liu QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_cur0, 681c0aceb7dSCharlene Liu QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_cur0); 682c0aceb7dSCharlene Liu REG_SET(DCN_CUR0_TTU_CNTL1, 0, 683c0aceb7dSCharlene Liu REFCYC_PER_REQ_DELIVERY_PRE, ttu_attr->refcyc_per_req_delivery_pre_cur0); 68486be9a04SYue Hin Lau } 68586be9a04SYue Hin Lau 68686be9a04SYue Hin Lau static void hubp1_setup( 68786be9a04SYue Hin Lau struct hubp *hubp, 68886be9a04SYue Hin Lau struct _vcs_dpi_display_dlg_regs_st *dlg_attr, 68986be9a04SYue Hin Lau struct _vcs_dpi_display_ttu_regs_st *ttu_attr, 69086be9a04SYue Hin Lau struct _vcs_dpi_display_rq_regs_st *rq_regs, 69186be9a04SYue Hin Lau struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest) 69286be9a04SYue Hin Lau { 69386be9a04SYue Hin Lau /* otg is locked when this func is called. Register are double buffered. 69486be9a04SYue Hin Lau * disable the requestors is not needed 69586be9a04SYue Hin Lau */ 69686be9a04SYue Hin Lau hubp1_program_requestor(hubp, rq_regs); 69786be9a04SYue Hin Lau hubp1_program_deadline(hubp, dlg_attr, ttu_attr); 69886be9a04SYue Hin Lau hubp1_vready_workaround(hubp, pipe_dest); 69986be9a04SYue Hin Lau } 70086be9a04SYue Hin Lau 70186be9a04SYue Hin Lau bool hubp1_is_flip_pending(struct hubp *hubp) 70286be9a04SYue Hin Lau { 70386be9a04SYue Hin Lau uint32_t flip_pending = 0; 70486be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 70586be9a04SYue Hin Lau struct dc_plane_address earliest_inuse_address; 70686be9a04SYue Hin Lau 70786be9a04SYue Hin Lau REG_GET(DCSURF_FLIP_CONTROL, 70886be9a04SYue Hin Lau SURFACE_FLIP_PENDING, &flip_pending); 70986be9a04SYue Hin Lau 71086be9a04SYue Hin Lau REG_GET(DCSURF_SURFACE_EARLIEST_INUSE, 71186be9a04SYue Hin Lau SURFACE_EARLIEST_INUSE_ADDRESS, &earliest_inuse_address.grph.addr.low_part); 71286be9a04SYue Hin Lau 71386be9a04SYue Hin Lau REG_GET(DCSURF_SURFACE_EARLIEST_INUSE_HIGH, 71486be9a04SYue Hin Lau SURFACE_EARLIEST_INUSE_ADDRESS_HIGH, &earliest_inuse_address.grph.addr.high_part); 71586be9a04SYue Hin Lau 71686be9a04SYue Hin Lau if (flip_pending) 71786be9a04SYue Hin Lau return true; 71886be9a04SYue Hin Lau 71986be9a04SYue Hin Lau if (earliest_inuse_address.grph.addr.quad_part != hubp->request_address.grph.addr.quad_part) 72086be9a04SYue Hin Lau return true; 72186be9a04SYue Hin Lau 72286be9a04SYue Hin Lau return false; 72386be9a04SYue Hin Lau } 72486be9a04SYue Hin Lau 72586be9a04SYue Hin Lau uint32_t aperture_default_system = 1; 72686be9a04SYue Hin Lau uint32_t context0_default_system; /* = 0;*/ 72786be9a04SYue Hin Lau 72886be9a04SYue Hin Lau static void hubp1_set_vm_system_aperture_settings(struct hubp *hubp, 72986be9a04SYue Hin Lau struct vm_system_aperture_param *apt) 73086be9a04SYue Hin Lau { 73186be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 73286be9a04SYue Hin Lau PHYSICAL_ADDRESS_LOC mc_vm_apt_default; 73386be9a04SYue Hin Lau PHYSICAL_ADDRESS_LOC mc_vm_apt_low; 73486be9a04SYue Hin Lau PHYSICAL_ADDRESS_LOC mc_vm_apt_high; 73586be9a04SYue Hin Lau 73686be9a04SYue Hin Lau mc_vm_apt_default.quad_part = apt->sys_default.quad_part >> 12; 73786be9a04SYue Hin Lau mc_vm_apt_low.quad_part = apt->sys_low.quad_part >> 12; 73886be9a04SYue Hin Lau mc_vm_apt_high.quad_part = apt->sys_high.quad_part >> 12; 73986be9a04SYue Hin Lau 74086be9a04SYue Hin Lau REG_SET_2(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, 0, 74186be9a04SYue Hin Lau MC_VM_SYSTEM_APERTURE_DEFAULT_SYSTEM, aperture_default_system, /* 1 = system physical memory */ 74286be9a04SYue Hin Lau MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, mc_vm_apt_default.high_part); 74386be9a04SYue Hin Lau REG_SET(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, 0, 74486be9a04SYue Hin Lau MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, mc_vm_apt_default.low_part); 74586be9a04SYue Hin Lau 74686be9a04SYue Hin Lau REG_SET(DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, 0, 74786be9a04SYue Hin Lau MC_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, mc_vm_apt_low.high_part); 74886be9a04SYue Hin Lau REG_SET(DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, 0, 74986be9a04SYue Hin Lau MC_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, mc_vm_apt_low.low_part); 75086be9a04SYue Hin Lau 75186be9a04SYue Hin Lau REG_SET(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, 0, 75286be9a04SYue Hin Lau MC_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, mc_vm_apt_high.high_part); 75386be9a04SYue Hin Lau REG_SET(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, 0, 75486be9a04SYue Hin Lau MC_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, mc_vm_apt_high.low_part); 75586be9a04SYue Hin Lau } 75686be9a04SYue Hin Lau 75786be9a04SYue Hin Lau static void hubp1_set_vm_context0_settings(struct hubp *hubp, 75886be9a04SYue Hin Lau const struct vm_context0_param *vm0) 75986be9a04SYue Hin Lau { 76086be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 76186be9a04SYue Hin Lau /* pte base */ 76286be9a04SYue Hin Lau REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, 0, 76386be9a04SYue Hin Lau VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, vm0->pte_base.high_part); 76486be9a04SYue Hin Lau REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB, 0, 76586be9a04SYue Hin Lau VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB, vm0->pte_base.low_part); 76686be9a04SYue Hin Lau 76786be9a04SYue Hin Lau /* pte start */ 76886be9a04SYue Hin Lau REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB, 0, 76986be9a04SYue Hin Lau VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB, vm0->pte_start.high_part); 77086be9a04SYue Hin Lau REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB, 0, 77186be9a04SYue Hin Lau VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB, vm0->pte_start.low_part); 77286be9a04SYue Hin Lau 77386be9a04SYue Hin Lau /* pte end */ 77486be9a04SYue Hin Lau REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, 0, 77586be9a04SYue Hin Lau VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, vm0->pte_end.high_part); 77686be9a04SYue Hin Lau REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB, 0, 77786be9a04SYue Hin Lau VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB, vm0->pte_end.low_part); 77886be9a04SYue Hin Lau 77986be9a04SYue Hin Lau /* fault handling */ 78086be9a04SYue Hin Lau REG_SET_2(DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB, 0, 78186be9a04SYue Hin Lau VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB, vm0->fault_default.high_part, 78286be9a04SYue Hin Lau VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_SYSTEM, context0_default_system); 78386be9a04SYue Hin Lau REG_SET(DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, 0, 78486be9a04SYue Hin Lau VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, vm0->fault_default.low_part); 78586be9a04SYue Hin Lau 78686be9a04SYue Hin Lau /* control: enable VM PTE*/ 78786be9a04SYue Hin Lau REG_SET_2(DCN_VM_MX_L1_TLB_CNTL, 0, 78886be9a04SYue Hin Lau ENABLE_L1_TLB, 1, 78986be9a04SYue Hin Lau SYSTEM_ACCESS_MODE, 3); 79086be9a04SYue Hin Lau } 79186be9a04SYue Hin Lau 79286be9a04SYue Hin Lau void min_set_viewport( 79386be9a04SYue Hin Lau struct hubp *hubp, 79486be9a04SYue Hin Lau const struct rect *viewport, 79586be9a04SYue Hin Lau const struct rect *viewport_c) 79686be9a04SYue Hin Lau { 79786be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 79886be9a04SYue Hin Lau 79986be9a04SYue Hin Lau REG_SET_2(DCSURF_PRI_VIEWPORT_DIMENSION, 0, 80086be9a04SYue Hin Lau PRI_VIEWPORT_WIDTH, viewport->width, 80186be9a04SYue Hin Lau PRI_VIEWPORT_HEIGHT, viewport->height); 80286be9a04SYue Hin Lau 80386be9a04SYue Hin Lau REG_SET_2(DCSURF_PRI_VIEWPORT_START, 0, 80486be9a04SYue Hin Lau PRI_VIEWPORT_X_START, viewport->x, 80586be9a04SYue Hin Lau PRI_VIEWPORT_Y_START, viewport->y); 80686be9a04SYue Hin Lau 80786be9a04SYue Hin Lau /*for stereo*/ 80886be9a04SYue Hin Lau REG_SET_2(DCSURF_SEC_VIEWPORT_DIMENSION, 0, 80986be9a04SYue Hin Lau SEC_VIEWPORT_WIDTH, viewport->width, 81086be9a04SYue Hin Lau SEC_VIEWPORT_HEIGHT, viewport->height); 81186be9a04SYue Hin Lau 81286be9a04SYue Hin Lau REG_SET_2(DCSURF_SEC_VIEWPORT_START, 0, 81386be9a04SYue Hin Lau SEC_VIEWPORT_X_START, viewport->x, 81486be9a04SYue Hin Lau SEC_VIEWPORT_Y_START, viewport->y); 81586be9a04SYue Hin Lau 81686be9a04SYue Hin Lau /* DC supports NV12 only at the moment */ 81786be9a04SYue Hin Lau REG_SET_2(DCSURF_PRI_VIEWPORT_DIMENSION_C, 0, 81886be9a04SYue Hin Lau PRI_VIEWPORT_WIDTH_C, viewport_c->width, 81986be9a04SYue Hin Lau PRI_VIEWPORT_HEIGHT_C, viewport_c->height); 82086be9a04SYue Hin Lau 82186be9a04SYue Hin Lau REG_SET_2(DCSURF_PRI_VIEWPORT_START_C, 0, 82286be9a04SYue Hin Lau PRI_VIEWPORT_X_START_C, viewport_c->x, 82386be9a04SYue Hin Lau PRI_VIEWPORT_Y_START_C, viewport_c->y); 82486be9a04SYue Hin Lau } 82586be9a04SYue Hin Lau 82634cb6b38SDmytro Laktyushkin void hubp1_read_state(struct hubp *hubp) 82786be9a04SYue Hin Lau { 8280a93dc7fSDmytro Laktyushkin struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 82934cb6b38SDmytro Laktyushkin struct dcn_hubp_state *s = &hubp1->state; 8300a93dc7fSDmytro Laktyushkin struct _vcs_dpi_display_dlg_regs_st *dlg_attr = &s->dlg_attr; 8310a93dc7fSDmytro Laktyushkin struct _vcs_dpi_display_ttu_regs_st *ttu_attr = &s->ttu_attr; 8320a93dc7fSDmytro Laktyushkin struct _vcs_dpi_display_rq_regs_st *rq_regs = &s->rq_regs; 8330a93dc7fSDmytro Laktyushkin 8340a93dc7fSDmytro Laktyushkin /* Requester */ 8350a93dc7fSDmytro Laktyushkin REG_GET(HUBPRET_CONTROL, 8360a93dc7fSDmytro Laktyushkin DET_BUF_PLANE1_BASE_ADDRESS, &rq_regs->plane1_base_address); 8370a93dc7fSDmytro Laktyushkin REG_GET_4(DCN_EXPANSION_MODE, 8380a93dc7fSDmytro Laktyushkin DRQ_EXPANSION_MODE, &rq_regs->drq_expansion_mode, 8390a93dc7fSDmytro Laktyushkin PRQ_EXPANSION_MODE, &rq_regs->prq_expansion_mode, 8400a93dc7fSDmytro Laktyushkin MRQ_EXPANSION_MODE, &rq_regs->mrq_expansion_mode, 8410a93dc7fSDmytro Laktyushkin CRQ_EXPANSION_MODE, &rq_regs->crq_expansion_mode); 8420a93dc7fSDmytro Laktyushkin REG_GET_8(DCHUBP_REQ_SIZE_CONFIG, 8430a93dc7fSDmytro Laktyushkin CHUNK_SIZE, &rq_regs->rq_regs_l.chunk_size, 8440a93dc7fSDmytro Laktyushkin MIN_CHUNK_SIZE, &rq_regs->rq_regs_l.min_chunk_size, 8450a93dc7fSDmytro Laktyushkin META_CHUNK_SIZE, &rq_regs->rq_regs_l.meta_chunk_size, 8460a93dc7fSDmytro Laktyushkin MIN_META_CHUNK_SIZE, &rq_regs->rq_regs_l.min_meta_chunk_size, 8470a93dc7fSDmytro Laktyushkin DPTE_GROUP_SIZE, &rq_regs->rq_regs_l.dpte_group_size, 8480a93dc7fSDmytro Laktyushkin MPTE_GROUP_SIZE, &rq_regs->rq_regs_l.mpte_group_size, 8490a93dc7fSDmytro Laktyushkin SWATH_HEIGHT, &rq_regs->rq_regs_l.swath_height, 8500a93dc7fSDmytro Laktyushkin PTE_ROW_HEIGHT_LINEAR, &rq_regs->rq_regs_l.pte_row_height_linear); 8510a93dc7fSDmytro Laktyushkin REG_GET_8(DCHUBP_REQ_SIZE_CONFIG_C, 8520a93dc7fSDmytro Laktyushkin CHUNK_SIZE_C, &rq_regs->rq_regs_c.chunk_size, 8530a93dc7fSDmytro Laktyushkin MIN_CHUNK_SIZE_C, &rq_regs->rq_regs_c.min_chunk_size, 8540a93dc7fSDmytro Laktyushkin META_CHUNK_SIZE_C, &rq_regs->rq_regs_c.meta_chunk_size, 8550a93dc7fSDmytro Laktyushkin MIN_META_CHUNK_SIZE_C, &rq_regs->rq_regs_c.min_meta_chunk_size, 8560a93dc7fSDmytro Laktyushkin DPTE_GROUP_SIZE_C, &rq_regs->rq_regs_c.dpte_group_size, 8570a93dc7fSDmytro Laktyushkin MPTE_GROUP_SIZE_C, &rq_regs->rq_regs_c.mpte_group_size, 8580a93dc7fSDmytro Laktyushkin SWATH_HEIGHT_C, &rq_regs->rq_regs_c.swath_height, 8590a93dc7fSDmytro Laktyushkin PTE_ROW_HEIGHT_LINEAR_C, &rq_regs->rq_regs_c.pte_row_height_linear); 8600a93dc7fSDmytro Laktyushkin 8610a93dc7fSDmytro Laktyushkin /* DLG - Per hubp */ 8620a93dc7fSDmytro Laktyushkin REG_GET_2(BLANK_OFFSET_0, 8630a93dc7fSDmytro Laktyushkin REFCYC_H_BLANK_END, &dlg_attr->refcyc_h_blank_end, 8640a93dc7fSDmytro Laktyushkin DLG_V_BLANK_END, &dlg_attr->dlg_vblank_end); 8650a93dc7fSDmytro Laktyushkin 8660a93dc7fSDmytro Laktyushkin REG_GET(BLANK_OFFSET_1, 8670a93dc7fSDmytro Laktyushkin MIN_DST_Y_NEXT_START, &dlg_attr->min_dst_y_next_start); 8680a93dc7fSDmytro Laktyushkin 8690a93dc7fSDmytro Laktyushkin REG_GET(DST_DIMENSIONS, 8700a93dc7fSDmytro Laktyushkin REFCYC_PER_HTOTAL, &dlg_attr->refcyc_per_htotal); 8710a93dc7fSDmytro Laktyushkin 8720a93dc7fSDmytro Laktyushkin REG_GET_2(DST_AFTER_SCALER, 8730a93dc7fSDmytro Laktyushkin REFCYC_X_AFTER_SCALER, &dlg_attr->refcyc_x_after_scaler, 8740a93dc7fSDmytro Laktyushkin DST_Y_AFTER_SCALER, &dlg_attr->dst_y_after_scaler); 8750a93dc7fSDmytro Laktyushkin 8760a93dc7fSDmytro Laktyushkin if (REG(PREFETCH_SETTINS)) 8770a93dc7fSDmytro Laktyushkin REG_GET_2(PREFETCH_SETTINS, 8780a93dc7fSDmytro Laktyushkin DST_Y_PREFETCH, &dlg_attr->dst_y_prefetch, 8790a93dc7fSDmytro Laktyushkin VRATIO_PREFETCH, &dlg_attr->vratio_prefetch); 8800a93dc7fSDmytro Laktyushkin else 8810a93dc7fSDmytro Laktyushkin REG_GET_2(PREFETCH_SETTINGS, 8820a93dc7fSDmytro Laktyushkin DST_Y_PREFETCH, &dlg_attr->dst_y_prefetch, 8830a93dc7fSDmytro Laktyushkin VRATIO_PREFETCH, &dlg_attr->vratio_prefetch); 8840a93dc7fSDmytro Laktyushkin 8850a93dc7fSDmytro Laktyushkin REG_GET_2(VBLANK_PARAMETERS_0, 8860a93dc7fSDmytro Laktyushkin DST_Y_PER_VM_VBLANK, &dlg_attr->dst_y_per_vm_vblank, 8870a93dc7fSDmytro Laktyushkin DST_Y_PER_ROW_VBLANK, &dlg_attr->dst_y_per_row_vblank); 8880a93dc7fSDmytro Laktyushkin 8890a93dc7fSDmytro Laktyushkin REG_GET(REF_FREQ_TO_PIX_FREQ, 8900a93dc7fSDmytro Laktyushkin REF_FREQ_TO_PIX_FREQ, &dlg_attr->ref_freq_to_pix_freq); 8910a93dc7fSDmytro Laktyushkin 8920a93dc7fSDmytro Laktyushkin /* DLG - Per luma/chroma */ 8930a93dc7fSDmytro Laktyushkin REG_GET(VBLANK_PARAMETERS_1, 8940a93dc7fSDmytro Laktyushkin REFCYC_PER_PTE_GROUP_VBLANK_L, &dlg_attr->refcyc_per_pte_group_vblank_l); 8950a93dc7fSDmytro Laktyushkin 8960a93dc7fSDmytro Laktyushkin REG_GET(VBLANK_PARAMETERS_3, 8970a93dc7fSDmytro Laktyushkin REFCYC_PER_META_CHUNK_VBLANK_L, &dlg_attr->refcyc_per_meta_chunk_vblank_l); 8980a93dc7fSDmytro Laktyushkin 8990a93dc7fSDmytro Laktyushkin if (REG(NOM_PARAMETERS_0)) 9000a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_0, 9010a93dc7fSDmytro Laktyushkin DST_Y_PER_PTE_ROW_NOM_L, &dlg_attr->dst_y_per_pte_row_nom_l); 9020a93dc7fSDmytro Laktyushkin 9030a93dc7fSDmytro Laktyushkin if (REG(NOM_PARAMETERS_1)) 9040a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_1, 9050a93dc7fSDmytro Laktyushkin REFCYC_PER_PTE_GROUP_NOM_L, &dlg_attr->refcyc_per_pte_group_nom_l); 9060a93dc7fSDmytro Laktyushkin 9070a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_4, 9080a93dc7fSDmytro Laktyushkin DST_Y_PER_META_ROW_NOM_L, &dlg_attr->dst_y_per_meta_row_nom_l); 9090a93dc7fSDmytro Laktyushkin 9100a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_5, 9110a93dc7fSDmytro Laktyushkin REFCYC_PER_META_CHUNK_NOM_L, &dlg_attr->refcyc_per_meta_chunk_nom_l); 9120a93dc7fSDmytro Laktyushkin 9130a93dc7fSDmytro Laktyushkin REG_GET_2(PER_LINE_DELIVERY_PRE, 9140a93dc7fSDmytro Laktyushkin REFCYC_PER_LINE_DELIVERY_PRE_L, &dlg_attr->refcyc_per_line_delivery_pre_l, 9150a93dc7fSDmytro Laktyushkin REFCYC_PER_LINE_DELIVERY_PRE_C, &dlg_attr->refcyc_per_line_delivery_pre_c); 9160a93dc7fSDmytro Laktyushkin 9170a93dc7fSDmytro Laktyushkin REG_GET_2(PER_LINE_DELIVERY, 9180a93dc7fSDmytro Laktyushkin REFCYC_PER_LINE_DELIVERY_L, &dlg_attr->refcyc_per_line_delivery_l, 9190a93dc7fSDmytro Laktyushkin REFCYC_PER_LINE_DELIVERY_C, &dlg_attr->refcyc_per_line_delivery_c); 9200a93dc7fSDmytro Laktyushkin 9210a93dc7fSDmytro Laktyushkin if (REG(PREFETCH_SETTINS_C)) 9220a93dc7fSDmytro Laktyushkin REG_GET(PREFETCH_SETTINS_C, 9230a93dc7fSDmytro Laktyushkin VRATIO_PREFETCH_C, &dlg_attr->vratio_prefetch_c); 9240a93dc7fSDmytro Laktyushkin else 9250a93dc7fSDmytro Laktyushkin REG_GET(PREFETCH_SETTINGS_C, 9260a93dc7fSDmytro Laktyushkin VRATIO_PREFETCH_C, &dlg_attr->vratio_prefetch_c); 9270a93dc7fSDmytro Laktyushkin 9280a93dc7fSDmytro Laktyushkin REG_GET(VBLANK_PARAMETERS_2, 9290a93dc7fSDmytro Laktyushkin REFCYC_PER_PTE_GROUP_VBLANK_C, &dlg_attr->refcyc_per_pte_group_vblank_c); 9300a93dc7fSDmytro Laktyushkin 9310a93dc7fSDmytro Laktyushkin REG_GET(VBLANK_PARAMETERS_4, 9320a93dc7fSDmytro Laktyushkin REFCYC_PER_META_CHUNK_VBLANK_C, &dlg_attr->refcyc_per_meta_chunk_vblank_c); 9330a93dc7fSDmytro Laktyushkin 9340a93dc7fSDmytro Laktyushkin if (REG(NOM_PARAMETERS_2)) 9350a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_2, 9360a93dc7fSDmytro Laktyushkin DST_Y_PER_PTE_ROW_NOM_C, &dlg_attr->dst_y_per_pte_row_nom_c); 9370a93dc7fSDmytro Laktyushkin 9380a93dc7fSDmytro Laktyushkin if (REG(NOM_PARAMETERS_3)) 9390a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_3, 9400a93dc7fSDmytro Laktyushkin REFCYC_PER_PTE_GROUP_NOM_C, &dlg_attr->refcyc_per_pte_group_nom_c); 9410a93dc7fSDmytro Laktyushkin 9420a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_6, 9430a93dc7fSDmytro Laktyushkin DST_Y_PER_META_ROW_NOM_C, &dlg_attr->dst_y_per_meta_row_nom_c); 9440a93dc7fSDmytro Laktyushkin 9450a93dc7fSDmytro Laktyushkin REG_GET(NOM_PARAMETERS_7, 9460a93dc7fSDmytro Laktyushkin REFCYC_PER_META_CHUNK_NOM_C, &dlg_attr->refcyc_per_meta_chunk_nom_c); 9470a93dc7fSDmytro Laktyushkin 9480a93dc7fSDmytro Laktyushkin /* TTU - per hubp */ 9490a93dc7fSDmytro Laktyushkin REG_GET_2(DCN_TTU_QOS_WM, 9500a93dc7fSDmytro Laktyushkin QoS_LEVEL_LOW_WM, &ttu_attr->qos_level_low_wm, 9510a93dc7fSDmytro Laktyushkin QoS_LEVEL_HIGH_WM, &ttu_attr->qos_level_high_wm); 9520a93dc7fSDmytro Laktyushkin 9530a93dc7fSDmytro Laktyushkin REG_GET_2(DCN_GLOBAL_TTU_CNTL, 9540a93dc7fSDmytro Laktyushkin MIN_TTU_VBLANK, &ttu_attr->min_ttu_vblank, 9550a93dc7fSDmytro Laktyushkin QoS_LEVEL_FLIP, &ttu_attr->qos_level_flip); 9560a93dc7fSDmytro Laktyushkin 9570a93dc7fSDmytro Laktyushkin /* TTU - per luma/chroma */ 9580a93dc7fSDmytro Laktyushkin /* Assumed surf0 is luma and 1 is chroma */ 9590a93dc7fSDmytro Laktyushkin 9600a93dc7fSDmytro Laktyushkin REG_GET_3(DCN_SURF0_TTU_CNTL0, 9610a93dc7fSDmytro Laktyushkin REFCYC_PER_REQ_DELIVERY, &ttu_attr->refcyc_per_req_delivery_l, 9620a93dc7fSDmytro Laktyushkin QoS_LEVEL_FIXED, &ttu_attr->qos_level_fixed_l, 9630a93dc7fSDmytro Laktyushkin QoS_RAMP_DISABLE, &ttu_attr->qos_ramp_disable_l); 9640a93dc7fSDmytro Laktyushkin 9650a93dc7fSDmytro Laktyushkin REG_GET(DCN_SURF0_TTU_CNTL1, 9660a93dc7fSDmytro Laktyushkin REFCYC_PER_REQ_DELIVERY_PRE, 9670a93dc7fSDmytro Laktyushkin &ttu_attr->refcyc_per_req_delivery_pre_l); 9680a93dc7fSDmytro Laktyushkin 9690a93dc7fSDmytro Laktyushkin REG_GET_3(DCN_SURF1_TTU_CNTL0, 9700a93dc7fSDmytro Laktyushkin REFCYC_PER_REQ_DELIVERY, &ttu_attr->refcyc_per_req_delivery_c, 9710a93dc7fSDmytro Laktyushkin QoS_LEVEL_FIXED, &ttu_attr->qos_level_fixed_c, 9720a93dc7fSDmytro Laktyushkin QoS_RAMP_DISABLE, &ttu_attr->qos_ramp_disable_c); 9730a93dc7fSDmytro Laktyushkin 9740a93dc7fSDmytro Laktyushkin REG_GET(DCN_SURF1_TTU_CNTL1, 9750a93dc7fSDmytro Laktyushkin REFCYC_PER_REQ_DELIVERY_PRE, 9760a93dc7fSDmytro Laktyushkin &ttu_attr->refcyc_per_req_delivery_pre_c); 9770a93dc7fSDmytro Laktyushkin 9780a93dc7fSDmytro Laktyushkin /* Rest of hubp */ 97986be9a04SYue Hin Lau REG_GET(DCSURF_SURFACE_CONFIG, 98086be9a04SYue Hin Lau SURFACE_PIXEL_FORMAT, &s->pixel_format); 98186be9a04SYue Hin Lau 98286be9a04SYue Hin Lau REG_GET(DCSURF_SURFACE_EARLIEST_INUSE_HIGH, 98386be9a04SYue Hin Lau SURFACE_EARLIEST_INUSE_ADDRESS_HIGH, &s->inuse_addr_hi); 98486be9a04SYue Hin Lau 985afd0384cSJun Lei REG_GET(DCSURF_SURFACE_EARLIEST_INUSE, 986afd0384cSJun Lei SURFACE_EARLIEST_INUSE_ADDRESS, &s->inuse_addr_lo); 987afd0384cSJun Lei 98886be9a04SYue Hin Lau REG_GET_2(DCSURF_PRI_VIEWPORT_DIMENSION, 98986be9a04SYue Hin Lau PRI_VIEWPORT_WIDTH, &s->viewport_width, 99086be9a04SYue Hin Lau PRI_VIEWPORT_HEIGHT, &s->viewport_height); 99186be9a04SYue Hin Lau 99286be9a04SYue Hin Lau REG_GET_2(DCSURF_SURFACE_CONFIG, 99386be9a04SYue Hin Lau ROTATION_ANGLE, &s->rotation_angle, 99486be9a04SYue Hin Lau H_MIRROR_EN, &s->h_mirror_en); 99586be9a04SYue Hin Lau 99686be9a04SYue Hin Lau REG_GET(DCSURF_TILING_CONFIG, 99786be9a04SYue Hin Lau SW_MODE, &s->sw_mode); 99886be9a04SYue Hin Lau 99986be9a04SYue Hin Lau REG_GET(DCSURF_SURFACE_CONTROL, 100086be9a04SYue Hin Lau PRIMARY_SURFACE_DCC_EN, &s->dcc_en); 100186be9a04SYue Hin Lau 100286be9a04SYue Hin Lau REG_GET_3(DCHUBP_CNTL, 100386be9a04SYue Hin Lau HUBP_BLANK_EN, &s->blank_en, 100486be9a04SYue Hin Lau HUBP_TTU_DISABLE, &s->ttu_disable, 100586be9a04SYue Hin Lau HUBP_UNDERFLOW_STATUS, &s->underflow_status); 100686be9a04SYue Hin Lau 100786be9a04SYue Hin Lau REG_GET(DCN_GLOBAL_TTU_CNTL, 100886be9a04SYue Hin Lau MIN_TTU_VBLANK, &s->min_ttu_vblank); 100986be9a04SYue Hin Lau 101086be9a04SYue Hin Lau REG_GET_2(DCN_TTU_QOS_WM, 101186be9a04SYue Hin Lau QoS_LEVEL_LOW_WM, &s->qos_level_low_wm, 101286be9a04SYue Hin Lau QoS_LEVEL_HIGH_WM, &s->qos_level_high_wm); 101386be9a04SYue Hin Lau } 101486be9a04SYue Hin Lau 101536192e7eSEric Bernstein enum cursor_pitch hubp1_get_cursor_pitch(unsigned int pitch) 101686be9a04SYue Hin Lau { 101786be9a04SYue Hin Lau enum cursor_pitch hw_pitch; 101886be9a04SYue Hin Lau 101986be9a04SYue Hin Lau switch (pitch) { 102086be9a04SYue Hin Lau case 64: 102186be9a04SYue Hin Lau hw_pitch = CURSOR_PITCH_64_PIXELS; 102286be9a04SYue Hin Lau break; 102386be9a04SYue Hin Lau case 128: 102486be9a04SYue Hin Lau hw_pitch = CURSOR_PITCH_128_PIXELS; 102586be9a04SYue Hin Lau break; 102686be9a04SYue Hin Lau case 256: 102786be9a04SYue Hin Lau hw_pitch = CURSOR_PITCH_256_PIXELS; 102886be9a04SYue Hin Lau break; 102986be9a04SYue Hin Lau default: 103086be9a04SYue Hin Lau DC_ERR("Invalid cursor pitch of %d. " 103186be9a04SYue Hin Lau "Only 64/128/256 is supported on DCN.\n", pitch); 103286be9a04SYue Hin Lau hw_pitch = CURSOR_PITCH_64_PIXELS; 103386be9a04SYue Hin Lau break; 103486be9a04SYue Hin Lau } 103586be9a04SYue Hin Lau return hw_pitch; 103686be9a04SYue Hin Lau } 103786be9a04SYue Hin Lau 103836192e7eSEric Bernstein static enum cursor_lines_per_chunk hubp1_get_lines_per_chunk( 103986be9a04SYue Hin Lau unsigned int cur_width, 104086be9a04SYue Hin Lau enum dc_cursor_color_format format) 104186be9a04SYue Hin Lau { 104286be9a04SYue Hin Lau enum cursor_lines_per_chunk line_per_chunk; 104386be9a04SYue Hin Lau 104486be9a04SYue Hin Lau if (format == CURSOR_MODE_MONO) 104586be9a04SYue Hin Lau /* impl B. expansion in CUR Buffer reader */ 104686be9a04SYue Hin Lau line_per_chunk = CURSOR_LINE_PER_CHUNK_16; 104786be9a04SYue Hin Lau else if (cur_width <= 32) 104886be9a04SYue Hin Lau line_per_chunk = CURSOR_LINE_PER_CHUNK_16; 104986be9a04SYue Hin Lau else if (cur_width <= 64) 105086be9a04SYue Hin Lau line_per_chunk = CURSOR_LINE_PER_CHUNK_8; 105186be9a04SYue Hin Lau else if (cur_width <= 128) 105286be9a04SYue Hin Lau line_per_chunk = CURSOR_LINE_PER_CHUNK_4; 105386be9a04SYue Hin Lau else 105486be9a04SYue Hin Lau line_per_chunk = CURSOR_LINE_PER_CHUNK_2; 105586be9a04SYue Hin Lau 105686be9a04SYue Hin Lau return line_per_chunk; 105786be9a04SYue Hin Lau } 105886be9a04SYue Hin Lau 105986be9a04SYue Hin Lau void hubp1_cursor_set_attributes( 106086be9a04SYue Hin Lau struct hubp *hubp, 106186be9a04SYue Hin Lau const struct dc_cursor_attributes *attr) 106286be9a04SYue Hin Lau { 106386be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 106436192e7eSEric Bernstein enum cursor_pitch hw_pitch = hubp1_get_cursor_pitch(attr->pitch); 106536192e7eSEric Bernstein enum cursor_lines_per_chunk lpc = hubp1_get_lines_per_chunk( 106686be9a04SYue Hin Lau attr->width, attr->color_format); 106786be9a04SYue Hin Lau 106886be9a04SYue Hin Lau hubp->curs_attr = *attr; 106986be9a04SYue Hin Lau 107086be9a04SYue Hin Lau REG_UPDATE(CURSOR_SURFACE_ADDRESS_HIGH, 107186be9a04SYue Hin Lau CURSOR_SURFACE_ADDRESS_HIGH, attr->address.high_part); 107286be9a04SYue Hin Lau REG_UPDATE(CURSOR_SURFACE_ADDRESS, 107386be9a04SYue Hin Lau CURSOR_SURFACE_ADDRESS, attr->address.low_part); 107486be9a04SYue Hin Lau 107586be9a04SYue Hin Lau REG_UPDATE_2(CURSOR_SIZE, 107686be9a04SYue Hin Lau CURSOR_WIDTH, attr->width, 107786be9a04SYue Hin Lau CURSOR_HEIGHT, attr->height); 107836192e7eSEric Bernstein 107986be9a04SYue Hin Lau REG_UPDATE_3(CURSOR_CONTROL, 108086be9a04SYue Hin Lau CURSOR_MODE, attr->color_format, 108186be9a04SYue Hin Lau CURSOR_PITCH, hw_pitch, 108286be9a04SYue Hin Lau CURSOR_LINES_PER_CHUNK, lpc); 108336192e7eSEric Bernstein 1084e9be38b4SEric Bernstein REG_SET_2(CURSOR_SETTINS, 0, 1085e9be38b4SEric Bernstein /* no shift of the cursor HDL schedule */ 1086e9be38b4SEric Bernstein CURSOR0_DST_Y_OFFSET, 0, 1087e9be38b4SEric Bernstein /* used to shift the cursor chunk request deadline */ 1088e9be38b4SEric Bernstein CURSOR0_CHUNK_HDL_ADJUST, 3); 108986be9a04SYue Hin Lau } 109086be9a04SYue Hin Lau 109186be9a04SYue Hin Lau void hubp1_cursor_set_position( 109286be9a04SYue Hin Lau struct hubp *hubp, 109386be9a04SYue Hin Lau const struct dc_cursor_position *pos, 109486be9a04SYue Hin Lau const struct dc_cursor_mi_param *param) 109586be9a04SYue Hin Lau { 109686be9a04SYue Hin Lau struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 109739a9f4d8SDmytro Laktyushkin int src_x_offset = pos->x - pos->x_hotspot - param->viewport.x; 109894a4ffd1SGloria Li int src_y_offset = pos->y - pos->y_hotspot - param->viewport.y; 109908ed681cSDmytro Laktyushkin int x_hotspot = pos->x_hotspot; 110008ed681cSDmytro Laktyushkin int y_hotspot = pos->y_hotspot; 110108ed681cSDmytro Laktyushkin uint32_t dst_x_offset; 110286be9a04SYue Hin Lau uint32_t cur_en = pos->enable ? 1 : 0; 110386be9a04SYue Hin Lau 110486be9a04SYue Hin Lau /* 110586be9a04SYue Hin Lau * Guard aganst cursor_set_position() from being called with invalid 110686be9a04SYue Hin Lau * attributes 110786be9a04SYue Hin Lau * 110886be9a04SYue Hin Lau * TODO: Look at combining cursor_set_position() and 110986be9a04SYue Hin Lau * cursor_set_attributes() into cursor_update() 111086be9a04SYue Hin Lau */ 111186be9a04SYue Hin Lau if (hubp->curs_attr.address.quad_part == 0) 111286be9a04SYue Hin Lau return; 111386be9a04SYue Hin Lau 111408ed681cSDmytro Laktyushkin if (param->rotation == ROTATION_ANGLE_90 || param->rotation == ROTATION_ANGLE_270) { 111508ed681cSDmytro Laktyushkin src_x_offset = pos->y - pos->y_hotspot - param->viewport.x; 111608ed681cSDmytro Laktyushkin y_hotspot = pos->x_hotspot; 111708ed681cSDmytro Laktyushkin x_hotspot = pos->y_hotspot; 111808ed681cSDmytro Laktyushkin } 111908ed681cSDmytro Laktyushkin 112008ed681cSDmytro Laktyushkin if (param->mirror) { 112108ed681cSDmytro Laktyushkin x_hotspot = param->viewport.width - x_hotspot; 112208ed681cSDmytro Laktyushkin src_x_offset = param->viewport.x + param->viewport.width - src_x_offset; 112308ed681cSDmytro Laktyushkin } 112408ed681cSDmytro Laktyushkin 112508ed681cSDmytro Laktyushkin dst_x_offset = (src_x_offset >= 0) ? src_x_offset : 0; 112686be9a04SYue Hin Lau dst_x_offset *= param->ref_clk_khz; 112786be9a04SYue Hin Lau dst_x_offset /= param->pixel_clk_khz; 112886be9a04SYue Hin Lau 112986be9a04SYue Hin Lau ASSERT(param->h_scale_ratio.value); 113086be9a04SYue Hin Lau 113186be9a04SYue Hin Lau if (param->h_scale_ratio.value) 1132eb0e5154SDmytro Laktyushkin dst_x_offset = dc_fixpt_floor(dc_fixpt_div( 1133eb0e5154SDmytro Laktyushkin dc_fixpt_from_int(dst_x_offset), 113486be9a04SYue Hin Lau param->h_scale_ratio)); 113586be9a04SYue Hin Lau 113639a9f4d8SDmytro Laktyushkin if (src_x_offset >= (int)param->viewport.width) 113786be9a04SYue Hin Lau cur_en = 0; /* not visible beyond right edge*/ 113886be9a04SYue Hin Lau 113935d13315SMartin Tsai if (src_x_offset + (int)hubp->curs_attr.width <= 0) 114086be9a04SYue Hin Lau cur_en = 0; /* not visible beyond left edge*/ 114186be9a04SYue Hin Lau 114294a4ffd1SGloria Li if (src_y_offset >= (int)param->viewport.height) 114394a4ffd1SGloria Li cur_en = 0; /* not visible beyond bottom edge*/ 114494a4ffd1SGloria Li 114594a4ffd1SGloria Li if (src_y_offset < 0) //+ (int)hubp->curs_attr.height 114694a4ffd1SGloria Li cur_en = 0; /* not visible beyond top edge*/ 114794a4ffd1SGloria Li 114886be9a04SYue Hin Lau if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0) 114936192e7eSEric Bernstein hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr); 115036192e7eSEric Bernstein 115186be9a04SYue Hin Lau REG_UPDATE(CURSOR_CONTROL, 115286be9a04SYue Hin Lau CURSOR_ENABLE, cur_en); 115386be9a04SYue Hin Lau 115486be9a04SYue Hin Lau REG_SET_2(CURSOR_POSITION, 0, 115586be9a04SYue Hin Lau CURSOR_X_POSITION, pos->x, 115686be9a04SYue Hin Lau CURSOR_Y_POSITION, pos->y); 115786be9a04SYue Hin Lau 115886be9a04SYue Hin Lau REG_SET_2(CURSOR_HOT_SPOT, 0, 115908ed681cSDmytro Laktyushkin CURSOR_HOT_SPOT_X, x_hotspot, 116008ed681cSDmytro Laktyushkin CURSOR_HOT_SPOT_Y, y_hotspot); 116186be9a04SYue Hin Lau 116286be9a04SYue Hin Lau REG_SET(CURSOR_DST_OFFSET, 0, 116386be9a04SYue Hin Lau CURSOR_DST_X_OFFSET, dst_x_offset); 116486be9a04SYue Hin Lau /* TODO Handle surface pixel formats other than 4:4:4 */ 116586be9a04SYue Hin Lau } 116686be9a04SYue Hin Lau 1167c8242b98SYongqiang Sun void hubp1_clk_cntl(struct hubp *hubp, bool enable) 1168c8242b98SYongqiang Sun { 1169c8242b98SYongqiang Sun struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 1170c8242b98SYongqiang Sun uint32_t clk_enable = enable ? 1 : 0; 1171c8242b98SYongqiang Sun 1172c8242b98SYongqiang Sun REG_UPDATE(HUBP_CLK_CNTL, HUBP_CLOCK_ENABLE, clk_enable); 1173c8242b98SYongqiang Sun } 1174c8242b98SYongqiang Sun 1175c8242b98SYongqiang Sun void hubp1_vtg_sel(struct hubp *hubp, uint32_t otg_inst) 1176c8242b98SYongqiang Sun { 1177c8242b98SYongqiang Sun struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 1178c8242b98SYongqiang Sun 1179c8242b98SYongqiang Sun REG_UPDATE(DCHUBP_CNTL, HUBP_VTG_SEL, otg_inst); 1180c8242b98SYongqiang Sun } 1181c8242b98SYongqiang Sun 1182bd4e7250SHarry Wentland static const struct hubp_funcs dcn10_hubp_funcs = { 118386be9a04SYue Hin Lau .hubp_program_surface_flip_and_addr = 118486be9a04SYue Hin Lau hubp1_program_surface_flip_and_addr, 118586be9a04SYue Hin Lau .hubp_program_surface_config = 118686be9a04SYue Hin Lau hubp1_program_surface_config, 118786be9a04SYue Hin Lau .hubp_is_flip_pending = hubp1_is_flip_pending, 118886be9a04SYue Hin Lau .hubp_setup = hubp1_setup, 118986be9a04SYue Hin Lau .hubp_set_vm_system_aperture_settings = hubp1_set_vm_system_aperture_settings, 119086be9a04SYue Hin Lau .hubp_set_vm_context0_settings = hubp1_set_vm_context0_settings, 119186be9a04SYue Hin Lau .set_blank = hubp1_set_blank, 119286be9a04SYue Hin Lau .dcc_control = hubp1_dcc_control, 119386be9a04SYue Hin Lau .mem_program_viewport = min_set_viewport, 119486be9a04SYue Hin Lau .set_hubp_blank_en = hubp1_set_hubp_blank_en, 119586be9a04SYue Hin Lau .set_cursor_attributes = hubp1_cursor_set_attributes, 119686be9a04SYue Hin Lau .set_cursor_position = hubp1_cursor_set_position, 11971dbac201SYongqiang Sun .hubp_disconnect = hubp1_disconnect, 1198c8242b98SYongqiang Sun .hubp_clk_cntl = hubp1_clk_cntl, 1199c8242b98SYongqiang Sun .hubp_vtg_sel = hubp1_vtg_sel, 12000a93dc7fSDmytro Laktyushkin .hubp_read_state = hubp1_read_state, 1201eb6b29d6SJun Lei .hubp_clear_underflow = hubp1_clear_underflow, 12023ba43a59SCharlene Liu .hubp_disable_control = hubp1_disable_control, 12033ba43a59SCharlene Liu .hubp_get_underflow_status = hubp1_get_underflow_status, 12043ba43a59SCharlene Liu 120586be9a04SYue Hin Lau }; 120686be9a04SYue Hin Lau 120786be9a04SYue Hin Lau /*****************************************/ 120886be9a04SYue Hin Lau /* Constructor, Destructor */ 120986be9a04SYue Hin Lau /*****************************************/ 121086be9a04SYue Hin Lau 121186be9a04SYue Hin Lau void dcn10_hubp_construct( 121286be9a04SYue Hin Lau struct dcn10_hubp *hubp1, 121386be9a04SYue Hin Lau struct dc_context *ctx, 121486be9a04SYue Hin Lau uint32_t inst, 1215c42c275cSYue Hin Lau const struct dcn_mi_registers *hubp_regs, 1216c42c275cSYue Hin Lau const struct dcn_mi_shift *hubp_shift, 1217c42c275cSYue Hin Lau const struct dcn_mi_mask *hubp_mask) 121886be9a04SYue Hin Lau { 121986be9a04SYue Hin Lau hubp1->base.funcs = &dcn10_hubp_funcs; 122086be9a04SYue Hin Lau hubp1->base.ctx = ctx; 1221c42c275cSYue Hin Lau hubp1->hubp_regs = hubp_regs; 1222c42c275cSYue Hin Lau hubp1->hubp_shift = hubp_shift; 1223c42c275cSYue Hin Lau hubp1->hubp_mask = hubp_mask; 122486be9a04SYue Hin Lau hubp1->base.inst = inst; 122586be9a04SYue Hin Lau hubp1->base.opp_id = 0xf; 122686be9a04SYue Hin Lau hubp1->base.mpcc_id = 0xf; 122786be9a04SYue Hin Lau } 122886be9a04SYue Hin Lau 122986be9a04SYue Hin Lau 1230