source: svn/newcon3bcm2_21bu/nexus/base/src/nexus_base_mmap.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 6.8 KB
Line 
1/***************************************************************************
2*     (c)2008-2010 Broadcom Corporation
3*
4*  This program is the proprietary software of Broadcom Corporation and/or its licensors,
5*  and may only be used, duplicated, modified or distributed pursuant to the terms and
6*  conditions of a separate, written license agreement executed between you and Broadcom
7*  (an "Authorized License").  Except as set forth in an Authorized License, Broadcom grants
8*  no license (express or implied), right to use, or waiver of any kind with respect to the
9*  Software, and Broadcom expressly reserves all rights in and to the Software and all
10*  intellectual property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU
11*  HAVE NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY
12*  NOTIFY BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.
13*
14*  Except as expressly set forth in the Authorized License,
15*
16*  1.     This program, including its structure, sequence and organization, constitutes the valuable trade
17*  secrets of Broadcom, and you shall use all reasonable efforts to protect the confidentiality thereof,
18*  and to use this information only in connection with your use of Broadcom integrated circuit products.
19*
20*  2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
21*  AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
22*  WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
23*  THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND ALL IMPLIED WARRANTIES
24*  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE,
25*  LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION
26*  OR CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF
27*  USE OR PERFORMANCE OF THE SOFTWARE.
28*
29*  3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR ITS
30*  LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR
31*  EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO YOUR
32*  USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF
33*  THE POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT
34*  ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE
35*  LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF
36*  ANY LIMITED REMEDY.
37*
38* $brcm_Workfile: nexus_base_mmap.c $
39* $brcm_Revision: 6 $
40* $brcm_Date: 12/17/10 4:47p $
41*
42* API Description:
43*
44* Revision History:
45*
46* $brcm_Log: /nexus/base/src/nexus_base_mmap.c $
47*
48* 6   12/17/10 4:47p erickson
49* SW7422-2: improve check
50*
51* 5   9/23/10 2:12p erickson
52* SW7420-943: refactor for driver/firmware partitioning
53*
54* 4   6/23/09 9:14a erickson
55* PR54881: Provide emulation support in Nexus
56*
57* 3   8/28/08 12:18p erickson
58* PR46284: added MSG
59*
60* 2   6/5/08 2:15p vsilyaev
61* PR 42318: Use 'const void *' for address translation
62*
63* 1   1/18/08 2:13p jgarrett
64* PR 38808: Merging to main branch
65*
66* Nexus_Devel/3   1/9/08 10:33a vsilyaev
67* PR 36199: Fixed math in NEXUS_OffsetTo functions
68*
69* Nexus_Devel/1   10/23/07 4:13p vsilyaev
70* PR 36199: Memory mapper sub-module
71*
72***************************************************************************/
73#include "bstd.h"
74#include "bdbg.h"
75#include "nexus_base_mmap.h"
76
77BDBG_MODULE(nexus_base_mmap);
78
79typedef struct NEXUS_P_MemoryMap {
80    size_t length;
81    uint32_t offset;
82    void *cached;
83    void *uncached;
84} NEXUS_P_MemoryMap;
85
86static NEXUS_P_MemoryMap g_NEXUS_P_MemoryMap[16];
87
88NEXUS_Error
89NEXUS_P_AddMap(uint32_t offset, void *cached, void *uncached, size_t length)
90{
91    unsigned i;
92
93#if !NEXUS_BASE_OS_linuxemu
94    /* offset==0 is normal in emulation environments */
95    if (offset==0) {
96        return BERR_TRACE(BERR_INVALID_PARAMETER);
97    }
98#endif
99    if (uncached==NULL && cached==NULL) {
100        return BERR_TRACE(BERR_INVALID_PARAMETER);
101    }
102
103    for(i=0;i<sizeof(g_NEXUS_P_MemoryMap)/sizeof(*g_NEXUS_P_MemoryMap);i++) {
104        if(g_NEXUS_P_MemoryMap[i].length==0) {
105            BDBG_MSG(("NEXUS_P_AddMap offset=%d length=%d cached_addr=%p uncached_addr=%p",
106                offset, length, cached, uncached));
107            g_NEXUS_P_MemoryMap[i].length = length;
108            g_NEXUS_P_MemoryMap[i].offset = offset;
109            g_NEXUS_P_MemoryMap[i].cached = cached;
110            g_NEXUS_P_MemoryMap[i].uncached = uncached;
111            return BERR_SUCCESS;
112        }
113    }
114    return BERR_TRACE(NEXUS_UNKNOWN);
115}
116
117uint32_t
118NEXUS_AddrToOffset(const void *addr)
119{
120    unsigned i;
121    const NEXUS_P_MemoryMap *map = g_NEXUS_P_MemoryMap;
122    for(i=0;i<sizeof(g_NEXUS_P_MemoryMap)/sizeof(*g_NEXUS_P_MemoryMap);i++) {
123        if(map[i].length==0) {
124            break;
125        }
126        if( (uint8_t *)addr>=(uint8_t *)map[i].cached &&
127            (uint8_t *)addr<((uint8_t *)map[i].cached + map[i].length) &&
128            map[i].cached != NULL
129            ) {
130            return map[i].offset + ((uint8_t *)addr - (uint8_t *)map[i].cached);
131        }
132        if( (uint8_t *)addr>=(uint8_t *)map[i].uncached &&
133            (uint8_t *)addr<((uint8_t *)map[i].uncached + map[i].length)) {
134            return map[i].offset + ((uint8_t *)addr - (uint8_t *)map[i].uncached);
135        }
136    }
137    BDBG_WRN(("NEXUS_AddrToOffset: unknown address %#lx", (unsigned long)addr));
138    return 0;
139}
140
141void *
142NEXUS_OffsetToCachedAddr(uint32_t offset)
143{
144    unsigned i;
145    const NEXUS_P_MemoryMap *map = g_NEXUS_P_MemoryMap;
146    for(i=0;i<sizeof(g_NEXUS_P_MemoryMap)/sizeof(*g_NEXUS_P_MemoryMap);i++) {
147        if(map[i].length==0) {
148            break;
149        }
150        if( offset>=map[i].offset &&
151            offset<(map[i].offset + map[i].length)) {
152            uint8_t *addr;
153
154            if(map[i].cached) {
155                addr = map[i].cached;
156            } else {
157                addr = map[i].uncached;
158            }
159            return addr + (offset - map[i].offset);
160        }
161    }
162    BDBG_WRN(("NEXUS_OffsetToCachedAddr: unknown address %#lx", (unsigned long)offset));
163    return NULL;
164}
165
166void *
167NEXUS_OffsetToUncachedAddr(uint32_t offset)
168{
169    unsigned i;
170    const NEXUS_P_MemoryMap *map = g_NEXUS_P_MemoryMap;
171
172    for(i=0;i<sizeof(g_NEXUS_P_MemoryMap)/sizeof(*g_NEXUS_P_MemoryMap);i++) {
173        if(map[i].length==0) {
174            break;
175        }
176        if( offset>=map[i].offset &&
177            offset<(map[i].offset + map[i].length)) {
178            return (uint8_t *)map[i].uncached + (offset - map[i].offset);
179        }
180    }
181    BDBG_WRN(("NEXUS_OffsetToUncachedAddr: unknown address %#lx", (unsigned long)offset));
182    return NULL;
183}
184
185void
186NEXUS_P_MapInit(void)
187{
188    unsigned i;
189    NEXUS_P_MemoryMap *map = g_NEXUS_P_MemoryMap;
190    for(i=0;i<sizeof(g_NEXUS_P_MemoryMap)/sizeof(*g_NEXUS_P_MemoryMap);i++) {
191        map[i].length = 0;
192        map[i].offset = 0;
193        map[i].cached = NULL;
194        map[i].uncached = NULL;
195    }
196    return ;
197}
198
Note: See TracBrowser for help on using the repository browser.