1/* 2 * Copyright (c) 2011 Aeroflex Gaisler 3 * 4 * BSD license: 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 26!unsigned int ahbslv_scan(register unsigned int vendor,register unsigned int driver) { 27! register unsigned int conf, mbar,i, *confp; 28! register unsigned int cfg_area = (unsigned int ) (LEON3_IO_AREA | LEON3_CONF_AREA | LEON3_AHB_SLAVE_CONF_AREA); 29! for (i = 0; i < LEON3_AHB_SLAVES; i++) 30! { 31! confp = (unsigned int*)(cfg_area + (i * LEON3_AHB_CONF_WORDS * 4)); 32! conf = *confp; 33! //mbar = *(unsigned int*)(i * LEON3_AHB_CONF_WORDS+ (4 * 4)); 34! if ((amba_vendor(conf) == vendor) && (amba_device(conf) == driver)) { 35! return (unsigned int)confp; 36! } 37! } 38! return 0; 39!} 40 41 42 .section ".text" 43 .global ahbslv_scan 44 .align 4 45 46ahbslv_scan: 47 mov %o0, %g1 48 mov -2048, %o5 49 mov 0, %o3 50 sll %o3, 5, %o0 51.LL11: 52 add %o5, %o0, %o4 53 ld [%o5+%o0], %o2 54 srl %o2, 24, %o0 55 cmp %o0, %g1 56 bne,a .LL10 57 add %o3, 1, %o3 58 srl %o2, 12, %o0 59 and %o0, 4095, %o0 60 cmp %o0, %o1 61 be .LL1 62 mov %o4, %o2 63 add %o3, 1, %o3 64.LL10: 65 cmp %o3, 7 66 bleu,a .LL11 67 sll %o3, 5, %o0 68 mov 0, %o2 69.LL1: 70 retl 71 mov %o2, %o0 72 73 74!unsigned int apbslv_scan(register unsigned int base,register unsigned int vendor, register unsigned int driver) { 75! register unsigned int conf, mbar,i, *confp; 76! for (i = 0; i < LEON3_APB_SLAVES; i++) 77! { 78! confp = (unsigned int*)(base + (i * LEON3_APB_CONF_WORDS * 4)); 79! conf = *confp; 80! //mbar = *(unsigned int*)(i * LEON3_AHB_CONF_WORDS+ (4 * 4)); 81! if ((amba_vendor(conf) == vendor) && (amba_device(conf) == driver)) { 82! return (unsigned int)confp; 83! } 84! } 85! return 0; 86!} 87 88 89 .section ".text" 90 .align 4 91 .global apbslv_scan 92 93apbslv_scan: 94 mov %o0, %g1 95 mov 0, %o4 96 sll %o4, 3, %o0 97.LL22: 98 add %g1, %o0, %o5 99 ld [%g1+%o0], %o3 100 srl %o3, 24, %o0 101 cmp %o0, %o1 102 bne,a .LL21 103 add %o4, 1, %o4 104 srl %o3, 12, %o0 105 and %o0, 4095, %o0 106 cmp %o0, %o2 107 be .LL12 108 mov %o5, %o3 109 add %o4, 1, %o4 110.LL21: 111 cmp %o4, 15 112 bleu,a .LL22 113 sll %o4, 3, %o0 114 mov 0, %o3 115.LL12: 116 retl 117 mov %o3, %o0 118 119 120 121!unsigned int getbase(register unsigned int *mbar,register unsigned int iobase) { 122! register unsigned int conf = mbar[1]; 123! return ((iobase & 0xfff00000) | 124! ((conf & 0xfff00000)>> 12)) & (((conf & 0x0000fff0) <<4) | 0xfff00000); 125! 126!} 127 128 129 .section ".text" 130 .align 4 131 .global iobar_getbase 132 133iobar_getbase: 134 ld [%o0+4], %o2 135 sethi %hi(-1048576), %o3 136 and %o1, %o3, %o1 137 and %o2, %o3, %o0 138 srl %o0, 12, %o0 139 or %o1, %o0, %o1 140 sethi %hi(64512), %o0 141 or %o0, 1008, %o0 142 and %o2, %o0, %o2 143 sll %o2, 4, %o2 144 or %o2, %o3, %o2 145 and %o1, %o2, %o1 146 retl 147 mov %o1, %o0 148 149