Home | History | Annotate | Download | only in sb
      1 /*
      2  * Copyright 2013 Vadim Girlin <vadimgirlin (at) gmail.com>
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * on the rights to use, copy, modify, merge, publish, distribute, sub
      8  * license, and/or sell copies of the Software, and to permit persons to whom
      9  * the Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *      Vadim Girlin
     25  */
     26 
     27 #include "sb_bc.h"
     28 
     29 namespace r600_sb {
     30 
     31 sb_log sblog;
     32 
     33 unsigned sb_context::dump_pass = 0;
     34 unsigned sb_context::dump_stat = 0;
     35 unsigned sb_context::dry_run = 0;
     36 unsigned sb_context::no_fallback = 0;
     37 unsigned sb_context::safe_math = 0;
     38 
     39 unsigned sb_context::dskip_start = 0;
     40 unsigned sb_context::dskip_end = 0;
     41 unsigned sb_context::dskip_mode = 0;
     42 
     43 int sb_context::init(r600_isa *isa, sb_hw_chip chip, sb_hw_class cclass) {
     44 	if (chip == HW_CHIP_UNKNOWN || cclass == HW_CLASS_UNKNOWN)
     45 		return -1;
     46 
     47 	this->isa = isa;
     48 
     49 	hw_chip = chip;
     50 	hw_class = cclass;
     51 
     52 	alu_temp_gprs = 4;
     53 
     54 	max_fetch = is_r600() ? 8 : 16;
     55 
     56 	has_trans = !is_cayman();
     57 
     58 	vtx_src_num = 1;
     59 
     60 	num_slots = has_trans ? 5 : 4;
     61 
     62 	uses_mova_gpr = is_r600() && chip != HW_CHIP_RV670;
     63 
     64 	r6xx_gpr_index_workaround = is_r600() && chip != HW_CHIP_RV670 && chip != HW_CHIP_RS780 && chip != HW_CHIP_RS880;
     65 
     66 	switch (chip) {
     67 	case HW_CHIP_RV610:
     68 	case HW_CHIP_RS780:
     69 	case HW_CHIP_RV620:
     70 	case HW_CHIP_RS880:
     71 		wavefront_size = 16;
     72 		stack_entry_size = 8;
     73 		break;
     74 	case HW_CHIP_RV630:
     75 	case HW_CHIP_RV635:
     76 	case HW_CHIP_RV730:
     77 	case HW_CHIP_RV710:
     78 	case HW_CHIP_PALM:
     79 	case HW_CHIP_CEDAR:
     80 		wavefront_size = 32;
     81 		stack_entry_size = 8;
     82 		break;
     83 	default:
     84 		wavefront_size = 64;
     85 		stack_entry_size = 4;
     86 		break;
     87 	}
     88 
     89 	stack_workaround_8xx = needs_8xx_stack_workaround();
     90 	stack_workaround_9xx = needs_9xx_stack_workaround();
     91 
     92 	return 0;
     93 }
     94 
     95 const char* sb_context::get_hw_class_name() {
     96 	switch (hw_class) {
     97 #define TRANSLATE_HW_CLASS(c) case HW_CLASS_##c: return #c
     98 		TRANSLATE_HW_CLASS(R600);
     99 		TRANSLATE_HW_CLASS(R700);
    100 		TRANSLATE_HW_CLASS(EVERGREEN);
    101 		TRANSLATE_HW_CLASS(CAYMAN);
    102 #undef TRANSLATE_HW_CLASS
    103 		default:
    104 			assert(!"unknown chip class");
    105 			return "INVALID_CHIP_CLASS";
    106 	}
    107 }
    108 
    109 const char* sb_context::get_hw_chip_name() {
    110 	switch (hw_chip) {
    111 #define TRANSLATE_CHIP(c) case HW_CHIP_##c: return #c
    112 		TRANSLATE_CHIP(R600);
    113 		TRANSLATE_CHIP(RV610);
    114 		TRANSLATE_CHIP(RV630);
    115 		TRANSLATE_CHIP(RV670);
    116 		TRANSLATE_CHIP(RV620);
    117 		TRANSLATE_CHIP(RV635);
    118 		TRANSLATE_CHIP(RS780);
    119 		TRANSLATE_CHIP(RS880);
    120 		TRANSLATE_CHIP(RV770);
    121 		TRANSLATE_CHIP(RV730);
    122 		TRANSLATE_CHIP(RV710);
    123 		TRANSLATE_CHIP(RV740);
    124 		TRANSLATE_CHIP(CEDAR);
    125 		TRANSLATE_CHIP(REDWOOD);
    126 		TRANSLATE_CHIP(JUNIPER);
    127 		TRANSLATE_CHIP(CYPRESS);
    128 		TRANSLATE_CHIP(HEMLOCK);
    129 		TRANSLATE_CHIP(PALM);
    130 		TRANSLATE_CHIP(SUMO);
    131 		TRANSLATE_CHIP(SUMO2);
    132 		TRANSLATE_CHIP(BARTS);
    133 		TRANSLATE_CHIP(TURKS);
    134 		TRANSLATE_CHIP(CAICOS);
    135 		TRANSLATE_CHIP(CAYMAN);
    136 		TRANSLATE_CHIP(ARUBA);
    137 #undef TRANSLATE_CHIP
    138 
    139 		default:
    140 			assert(!"unknown chip");
    141 			return "INVALID_CHIP";
    142 	}
    143 }
    144 
    145 } // namespace r600_sb
    146