1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_pipe.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_opcodes.h"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eg_sq.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <errno.h>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint eg_bytecode_cf_build(struct r600_bytecode *bc, struct r600_bytecode_cf *cf)
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned id = cf->id;
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (cf->inst) {
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU:
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER:
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER:
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE:
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* prepend ALU_EXTENDED if we need more than 2 kcache sets */
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (cf->eg_alu_extended) {
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc->bytecode[id++] =
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD0_EXT_KCACHE_BANK_INDEX_MODE0(V_SQ_CF_INDEX_NONE) |
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD0_EXT_KCACHE_BANK_INDEX_MODE1(V_SQ_CF_INDEX_NONE) |
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD0_EXT_KCACHE_BANK_INDEX_MODE2(V_SQ_CF_INDEX_NONE) |
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD0_EXT_KCACHE_BANK_INDEX_MODE3(V_SQ_CF_INDEX_NONE) |
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD0_EXT_KCACHE_BANK2(cf->kcache[2].bank) |
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD0_EXT_KCACHE_BANK3(cf->kcache[3].bank) |
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD0_EXT_KCACHE_MODE2(cf->kcache[2].mode);
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc->bytecode[id++] = EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_EXTENDED |
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD1_EXT_KCACHE_MODE3(cf->kcache[3].mode) |
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD1_EXT_KCACHE_ADDR2(cf->kcache[2].addr) |
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD1_EXT_KCACHE_ADDR3(cf->kcache[3].addr) |
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_SQ_CF_ALU_WORD1_EXT_BARRIER(1);
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = S_SQ_CF_ALU_WORD0_ADDR(cf->addr >> 1) |
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALU_WORD0_KCACHE_MODE0(cf->kcache[0].mode) |
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALU_WORD0_KCACHE_BANK0(cf->kcache[0].bank) |
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALU_WORD0_KCACHE_BANK1(cf->kcache[1].bank);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = cf->inst |
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALU_WORD1_KCACHE_MODE1(cf->kcache[1].mode) |
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALU_WORD1_KCACHE_ADDR0(cf->kcache[0].addr) |
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALU_WORD1_KCACHE_ADDR1(cf->kcache[1].addr) |
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_SQ_CF_ALU_WORD1_BARRIER(1) |
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_SQ_CF_ALU_WORD1_COUNT((cf->ndw / 2) - 1);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_VTX:
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->addr >> 1);
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = cf->inst |
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_SQ_CF_WORD1_BARRIER(1) |
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_SQ_CF_WORD1_COUNT((cf->ndw / 4) - 1);
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT:
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE:
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = S_SQ_CF_ALLOC_EXPORT_WORD0_RW_GPR(cf->output.gpr) |
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD0_ELEM_SIZE(cf->output.elem_size) |
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD0_ARRAY_BASE(cf->output.array_base) |
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD0_TYPE(cf->output.type);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id] = S_SQ_CF_ALLOC_EXPORT_WORD1_BURST_COUNT(cf->output.burst_count - 1) |
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_X(cf->output.swizzle_x) |
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_Y(cf->output.swizzle_y) |
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_Z(cf->output.swizzle_z) |
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_W(cf->output.swizzle_w) |
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_BARRIER(cf->output.barrier) |
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cf->output.inst;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (bc->chip_class == EVERGREEN) /* no EOP on cayman */
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc->bytecode[id] |= S_SQ_CF_ALLOC_EXPORT_WORD1_END_OF_PROGRAM(cf->output.end_of_program);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		id++;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0:
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1:
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1_BUF0:
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1_BUF1:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1_BUF2:
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1_BUF3:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2_BUF0:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2_BUF1:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2_BUF2:
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2_BUF3:
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3_BUF0:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3_BUF1:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3_BUF2:
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3_BUF3:
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = S_SQ_CF_ALLOC_EXPORT_WORD0_RW_GPR(cf->output.gpr) |
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD0_ELEM_SIZE(cf->output.elem_size) |
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD0_ARRAY_BASE(cf->output.array_base) |
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD0_TYPE(cf->output.type);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id] = S_SQ_CF_ALLOC_EXPORT_WORD1_BURST_COUNT(cf->output.burst_count - 1) |
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_BARRIER(cf->output.barrier) |
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cf->output.inst |
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_BUF_COMP_MASK(cf->output.comp_mask) |
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_SQ_CF_ALLOC_EXPORT_WORD1_BUF_ARRAY_SIZE(cf->output.array_size);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (bc->chip_class == EVERGREEN) /* no EOP on cayman */
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc->bytecode[id] |= S_SQ_CF_ALLOC_EXPORT_WORD1_END_OF_PROGRAM(cf->output.end_of_program);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		id++;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_JUMP:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_ELSE:
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_POP:
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL:
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_DX10:
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END:
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE:
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK:
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS:
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case EG_V_SQ_CF_WORD1_SQ_CF_INST_RETURN:
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CM_V_SQ_CF_WORD1_SQ_CF_INST_END:
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->cf_addr >> 1);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = cf->inst |
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_SQ_CF_WORD1_BARRIER(1) |
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_SQ_CF_WORD1_COND(cf->cond) |
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_SQ_CF_WORD1_POP_COUNT(cf->pop_count);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CF_NATIVE:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = cf->isa[0];
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc->bytecode[id++] = cf->isa[1];
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("unsupported CF instruction (0x%X)\n", cf->inst);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
147