Subversion Repositories HelenOS-historic

Rev

Rev 1302 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1302 Rev 1324
Line 1... Line 1...
1
/*
1
/*
2
 *  The PCI Library -- Generic Direct Access Functions
2
 *  The PCI Library -- Generic Direct Access Functions
3
 *
3
 *
4
 *  Copyright (c) 1997--2000 Martin Mares <mj@ucw.cz>
4
 *  Copyright (c) 1997--2000 Martin Mares <mj@ucw.cz>
5
 *
5
 *
6
 *  Modified and ported to HelenOS by Jakub Jermar.
6
 *  May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar.
7
 *
7
 *
8
 *  Can be freely distributed and used under the terms of the GNU GPL.
8
 *  Can be freely distributed and used under the terms of the GNU GPL.
9
 */
9
 */
10
 
10
 
11
#include <string.h>
11
#include <string.h>
Line 104... Line 104...
104
            cnt = 1;
104
            cnt = 1;
105
            break;
105
            break;
106
        }
106
        }
107
        if (cnt) {
107
        if (cnt) {
108
            for (i = 0; i < cnt; i++) {
108
            for (i = 0; i < cnt; i++) {
109
                u32 x =
-
 
110
                    pci_read_long(d,
-
 
111
                          PCI_BASE_ADDRESS_0 +
109
                u32 x = pci_read_long(d, PCI_BASE_ADDRESS_0 + i * 4);
112
                          i * 4);
-
 
113
                if (!x || x == (u32) ~ 0)
110
                if (!x || x == (u32) ~ 0)
114
                    continue;
111
                    continue;
115
                if ((x & PCI_BASE_ADDRESS_SPACE) ==
112
                if ((x & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
116
                    PCI_BASE_ADDRESS_SPACE_IO)
-
 
117
                    d->base_addr[i] = x;
113
                    d->base_addr[i] = x;
118
                else {
114
                else {
119
                    if ((x &
-
 
120
                         PCI_BASE_ADDRESS_MEM_TYPE_MASK)
115
                    if ((x & PCI_BASE_ADDRESS_MEM_TYPE_MASK) != PCI_BASE_ADDRESS_MEM_TYPE_64)
121
                        !=
-
 
122
                        PCI_BASE_ADDRESS_MEM_TYPE_64)
-
 
123
                        d->base_addr[i] = x;
116
                        d->base_addr[i] = x;
124
                    else if (i >= cnt - 1)
117
                    else if (i >= cnt - 1)
125
                        a->warning
-
 
126
                            ("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.",
118
                        a->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.",
127
                             d->domain, d->bus,
119
                             d->domain, d->bus,
128
                             d->dev, d->func, i);
120
                             d->dev, d->func, i);
129
                    else {
121
                    else {
130
                        u32 y =
-
 
131
                            pci_read_long(d,
-
 
132
                                  PCI_BASE_ADDRESS_0
122
                        u32 y = pci_read_long(d, PCI_BASE_ADDRESS_0 + (++i) * 4);
133
                                  +
-
 
134
                                  (++i) *
-
 
135
                                  4);
-
 
136
#ifdef PCI_HAVE_64BIT_ADDRESS
123
#ifdef PCI_HAVE_64BIT_ADDRESS
137
                        d->base_addr[i - 1] =
-
 
138
                            x | (((pciaddr_t) y) <<
124
                        d->base_addr[i - 1] = x | (((pciaddr_t) y) << 32);
139
                             32);
-
 
140
#else
125
#else
141
                        if (y)
126
                        if (y)
142
                            a->warning
-
 
143
                                ("%04x:%02x:%02x.%d 64-bit device address ignored.",
127
                            a->warning("%04x:%02x:%02x.%d 64-bit device address ignored.",
144
                                 d->domain,
128
                                 d->domain,
145
                                 d->bus,
129
                                 d->bus,
146
                                 d->dev,
130
                                 d->dev,
147
                                 d->func);
131
                                 d->func);
148
                        else
132
                        else
149
                            d->base_addr[i -
133
                            d->base_addr[i - 1] = x;
150
                                     1] =
-
 
151
                                x;
-
 
152
#endif
134
#endif
153
                    }
135
                    }
154
                }
136
                }
155
            }
137
            }
156
        }
138
        }
Line 213... Line 195...
213
    return 1;
195
    return 1;
214
}
196
}
215
 
197
 
216
int pci_generic_block_read(struct pci_dev *d, int pos, byte * buf, int len)
198
int pci_generic_block_read(struct pci_dev *d, int pos, byte * buf, int len)
217
{
199
{
218
    return pci_generic_block_op(d, pos, buf, len,
200
    return pci_generic_block_op(d, pos, buf, len, d->access->methods->read);
219
                    d->access->methods->read);
-
 
220
}
201
}
221
 
202
 
222
int pci_generic_block_write(struct pci_dev *d, int pos, byte * buf, int len)
203
int pci_generic_block_write(struct pci_dev *d, int pos, byte * buf, int len)
223
{
204
{
224
    return pci_generic_block_op(d, pos, buf, len,
205
    return pci_generic_block_op(d, pos, buf, len, d->access->methods->write);
225
                    d->access->methods->write);
-
 
226
}
206
}