View | Details | Raw Unified | Return to bug 239065
Collapse All | Expand All

(-)b/devel/libpciaccess/Makefile (-3 / +1 lines)
Lines 1-7 Link Here
1
# $FreeBSD$
1
# $FreeBSD$
2
2
3
PORTNAME=	libpciaccess
3
PORTNAME=	libpciaccess
4
PORTVERSION=	0.14
4
PORTVERSION=	0.16
5
CATEGORIES=	devel
5
CATEGORIES=	devel
6
6
7
MAINTAINER=	x11@FreeBSD.org
7
MAINTAINER=	x11@FreeBSD.org
Lines 10-17 COMMENT= Generic PCI access library Link Here
10
LICENSE=	MIT
10
LICENSE=	MIT
11
LICENSE_FILE=	${WRKSRC}/COPYING
11
LICENSE_FILE=	${WRKSRC}/COPYING
12
12
13
USES=		autoreconf
14
15
BUILD_DEPENDS=	${LOCALBASE}/share/pciids/pci.ids:misc/pciids
13
BUILD_DEPENDS=	${LOCALBASE}/share/pciids/pci.ids:misc/pciids
16
RUN_DEPENDS=	${LOCALBASE}/share/pciids/pci.ids:misc/pciids
14
RUN_DEPENDS=	${LOCALBASE}/share/pciids/pci.ids:misc/pciids
17
15
(-)b/devel/libpciaccess/distinfo (-3 / +3 lines)
Lines 1-3 Link Here
1
TIMESTAMP = 1560371905
1
TIMESTAMP = 1564692641
2
SHA256 (xorg/lib/libpciaccess-0.14.tar.bz2) = 3df543e12afd41fea8eac817e48cbfde5aed8817b81670a4e9e493bb2f5bf2a4
2
SHA256 (xorg/lib/libpciaccess-0.16.tar.bz2) = 214c9d0d884fdd7375ec8da8dcb91a8d3169f263294c9a90c575bf1938b9f489
3
SIZE (xorg/lib/libpciaccess-0.14.tar.bz2) = 361375
3
SIZE (xorg/lib/libpciaccess-0.16.tar.bz2) = 366603
(-)a/devel/libpciaccess/files/patch-configure.ac (-17 lines)
Removed Link Here
1
--- configure.ac.orig	2017-10-23 15:48:29 UTC
2
+++ configure.ac
3
@@ -133,14 +133,6 @@ if test "x$have_mtrr_h" = xyes; then
4
     AC_DEFINE(HAVE_MTRR, 1, [Use MTRRs on mappings])
5
 fi
6
 
7
-# check for the pci_io.pi_sel.pc_domain
8
-AC_CHECK_MEMBER([struct pci_io.pi_sel.pc_domain],
9
-               [AC_DEFINE(HAVE_PCI_IO_PC_DOMAIN,1,[Have the pci_io.pi_sel.pc_domain member.])],
10
-               [],
11
-               [ #include <sys/types.h>
12
-                 #include <sys/pciio.h>
13
-               ])
14
-
15
 AC_SUBST(PCIACCESS_CFLAGS)
16
 AC_SUBST(PCIACCESS_LIBS)
17
 
(-)a/devel/libpciaccess/files/patch-src-common_init.c (-13 lines)
Removed Link Here
1
--- src/common_init.c.orig	2015-02-03 23:59:14 UTC
2
+++ src/common_init.c
3
@@ -72,7 +72,9 @@ pci_system_init( void )
4
 void
5
 pci_system_init_dev_mem(int fd)
6
 {
7
-#ifdef __OpenBSD__
8
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
9
+    pci_system_freebsd_init_dev_mem(fd);
10
+#elif defined(__OpenBSD__)
11
     pci_system_openbsd_init_dev_mem(fd);
12
 #endif
13
 }
(-)a/devel/libpciaccess/files/patch-src-freebsd_pci.c (-664 lines)
Removed Link Here
1
--- src/freebsd_pci.c.orig	2017-10-23 15:48:29 UTC
2
+++ src/freebsd_pci.c
3
@@ -43,6 +43,11 @@
4
 #include <unistd.h>
5
 #include <fcntl.h>
6
 #include <errno.h>
7
+#if defined(__i386__) || defined(__amd64__)
8
+#include <machine/cpufunc.h>
9
+#else
10
+#include <dev/io/iodev.h>
11
+#endif
12
 #include <sys/types.h>
13
 #include <sys/param.h>
14
 #include <sys/pciio.h>
15
@@ -52,31 +57,35 @@
16
 #include "pciaccess.h"
17
 #include "pciaccess_private.h"
18
 
19
-#define	PCIC_DISPLAY	0x03
20
+#define	PCIC_DISPLAY		0x03
21
 #define	PCIS_DISPLAY_VGA	0x00
22
 #define	PCIS_DISPLAY_XGA	0x01
23
 #define	PCIS_DISPLAY_3D		0x02
24
 #define	PCIS_DISPLAY_OTHER	0x80
25
 
26
 /* Registers taken from pcireg.h */
27
-#define PCIR_COMMAND    0x04
28
-#define PCIM_CMD_PORTEN         0x0001
29
-#define PCIM_CMD_MEMEN          0x0002
30
-#define PCIR_BIOS	0x30
31
+#define PCIR_COMMAND		0x04
32
+#define PCIM_CMD_PORTEN		0x0001
33
+#define PCIM_CMD_MEMEN		0x0002
34
+#define PCIR_BIOS		0x30
35
 #define PCIM_BIOS_ENABLE	0x01
36
 #define PCIM_BIOS_ADDR_MASK	0xfffff800
37
 
38
-#define PCIR_BARS       0x10
39
-#define PCIR_BAR(x)             (PCIR_BARS + (x) * 4)
40
-#define PCI_BAR_IO(x)           (((x) & PCIM_BAR_SPACE) == PCIM_BAR_IO_SPACE)
41
-#define PCI_BAR_MEM(x)          (((x) & PCIM_BAR_SPACE) == PCIM_BAR_MEM_SPACE)
42
-#define PCIM_BAR_MEM_TYPE       0x00000006
43
-#define PCIM_BAR_MEM_64         4
44
-#define PCIM_BAR_MEM_PREFETCH   0x00000008
45
-#define PCIM_BAR_SPACE          0x00000001
46
-#define PCIM_BAR_MEM_SPACE      0
47
-#define PCIM_BAR_IO_SPACE       1
48
+#define PCIR_BARS		0x10
49
+#define PCIR_BAR(x)		(PCIR_BARS + (x) * 4)
50
+#define PCI_BAR_IO(x)		(((x) & PCIM_BAR_SPACE) == PCIM_BAR_IO_SPACE)
51
+#define PCI_BAR_MEM(x)		(((x) & PCIM_BAR_SPACE) == PCIM_BAR_MEM_SPACE)
52
+#define PCIM_BAR_MEM_TYPE	0x00000006
53
+#define PCIM_BAR_MEM_64		4
54
+#define PCIM_BAR_MEM_PREFETCH	0x00000008
55
+#define PCIM_BAR_SPACE		0x00000001
56
+#define PCIM_BAR_MEM_SPACE	0
57
+#define PCIM_BAR_IO_SPACE	1
58
 
59
+#if defined(__sparc64__)
60
+static int screenfd;
61
+#endif
62
+
63
 /**
64
  * FreeBSD private pci_system structure that extends the base pci_system
65
  * structure.
66
@@ -103,17 +112,23 @@ struct freebsd_pci_system {
67
  * Zero on success or an \c errno value on failure.
68
  */
69
 static int
70
-pci_device_freebsd_map_range(struct pci_device *dev,
71
-			     struct pci_device_mapping *map)
72
+pci_device_freebsd_map_range( struct pci_device *dev,
73
+			      struct pci_device_mapping *map )
74
 {
75
     const int prot = ((map->flags & PCI_DEV_MAP_FLAG_WRITABLE) != 0)
76
         ? (PROT_READ | PROT_WRITE) : PROT_READ;
77
+#if !defined(__sparc64__)
78
     struct mem_range_desc mrd;
79
     struct mem_range_op mro;
80
+#endif
81
 
82
     int fd, err = 0;
83
 
84
+#if defined(__sparc64__)
85
+    fd = screenfd;
86
+#else
87
     fd = open("/dev/mem", O_RDWR | O_CLOEXEC);
88
+#endif
89
     if (fd == -1)
90
 	return errno;
91
 
92
@@ -123,6 +138,7 @@ pci_device_freebsd_map_range(struct pci_device *dev,
93
 	err = errno;
94
     }
95
 
96
+#if !defined(__sparc64__)
97
     mrd.mr_base = map->base;
98
     mrd.mr_len = map->size;
99
     strncpy(mrd.mr_owner, "pciaccess", sizeof(mrd.mr_owner));
100
@@ -143,6 +159,7 @@ pci_device_freebsd_map_range(struct pci_device *dev,
101
     }
102
 
103
     close(fd);
104
+#endif
105
 
106
     return err;
107
 }
108
@@ -151,6 +168,7 @@ static int
109
 pci_device_freebsd_unmap_range( struct pci_device *dev,
110
 				struct pci_device_mapping *map )
111
 {
112
+#if !defined(__sparc64__)
113
     struct mem_range_desc mrd;
114
     struct mem_range_op mro;
115
     int fd;
116
@@ -176,6 +194,7 @@ pci_device_freebsd_unmap_range( struct pci_device *dev
117
 	    fprintf(stderr, "Failed to open /dev/mem\n");
118
 	}
119
     }
120
+#endif
121
 
122
     return pci_device_generic_unmap_range(dev, map);
123
 }
124
@@ -187,9 +206,7 @@ pci_device_freebsd_read( struct pci_device * dev, void
125
 {
126
     struct pci_io io;
127
 
128
-#if HAVE_PCI_IO_PC_DOMAIN
129
     io.pi_sel.pc_domain = dev->domain;
130
-#endif
131
     io.pi_sel.pc_bus = dev->bus;
132
     io.pi_sel.pc_dev = dev->dev;
133
     io.pi_sel.pc_func = dev->func;
134
@@ -227,9 +244,7 @@ pci_device_freebsd_write( struct pci_device * dev, con
135
 {
136
     struct pci_io io;
137
 
138
-#if HAVE_PCI_IO_PC_DOMAIN
139
     io.pi_sel.pc_domain = dev->domain;
140
-#endif
141
     io.pi_sel.pc_bus = dev->bus;
142
     io.pi_sel.pc_dev = dev->dev;
143
     io.pi_sel.pc_func = dev->func;
144
@@ -298,7 +313,11 @@ pci_device_freebsd_read_rom( struct pci_device * dev, 
145
     }
146
 
147
     printf("Using rom_base = 0x%lx\n", (long)rom_base);
148
+#if defined(__sparc64__)
149
+    memfd = screenfd;
150
+#else
151
     memfd = open( "/dev/mem", O_RDONLY | O_CLOEXEC );
152
+#endif
153
     if ( memfd == -1 )
154
 	return errno;
155
 
156
@@ -311,7 +330,9 @@ pci_device_freebsd_read_rom( struct pci_device * dev, 
157
     memcpy( buffer, bios, dev->rom_size );
158
 
159
     munmap( bios, dev->rom_size );
160
+#if !defined(__sparc64__)
161
     close( memfd );
162
+#endif
163
 
164
     if (pci_rom) {
165
 	pci_device_cfg_write_u32( dev, PCIR_BIOS, rom );
166
@@ -341,19 +362,14 @@ pci_device_freebsd_get_num_regions( struct pci_device 
167
     }
168
 }
169
 
170
-#ifdef PCIOCGETBAR
171
-
172
 static int
173
 pci_device_freebsd_probe( struct pci_device * dev )
174
 {
175
-    struct pci_device_private *priv = (struct pci_device_private *) dev;
176
     struct pci_bar_io bar;
177
     uint8_t irq;
178
     int err, i;
179
 
180
-#if HAVE_PCI_IO_PC_DOMAIN
181
     bar.pbi_sel.pc_domain = dev->domain;
182
-#endif
183
     bar.pbi_sel.pc_bus = dev->bus;
184
     bar.pbi_sel.pc_dev = dev->dev;
185
     bar.pbi_sel.pc_func = dev->func;
186
@@ -397,307 +413,191 @@ pci_device_freebsd_probe( struct pci_device * dev )
187
      return 0;
188
 }
189
 
190
-#else
191
-
192
-/** Masks out the flag bigs of the base address register value */
193
-static uint32_t
194
-get_map_base( uint32_t val )
195
+static void
196
+pci_system_freebsd_destroy( void )
197
 {
198
-    if (val & 0x01)
199
-	return val & ~0x03;
200
-    else
201
-	return val & ~0x0f;
202
+    close(freebsd_pci_sys->pcidev);
203
+    free(freebsd_pci_sys->pci_sys.devices);
204
+    freebsd_pci_sys = NULL;
205
 }
206
 
207
-/** Returns the size of a region based on the all-ones test value */
208
 static int
209
-get_test_val_size( uint32_t testval )
210
+pci_device_freebsd_has_kernel_driver( struct pci_device *dev )
211
 {
212
-    if (testval == 0)
213
-	return 0;
214
+    struct pci_io io;
215
 
216
-    /* Mask out the flag bits */
217
-    testval = get_map_base( testval );
218
-
219
-    return 1 << (ffs(testval) - 1);
220
-}
221
-
222
-/**
223
- * Sets the address and size information for the region from config space
224
- * registers.
225
- *
226
- * This would be much better provided by a kernel interface.
227
- *
228
- * \return 0 on success, or an errno value.
229
- */
230
-static int
231
-pci_device_freebsd_get_region_info( struct pci_device * dev, int region,
232
-				    int bar )
233
-{
234
-    uint32_t addr, testval;
235
-    uint16_t cmd;
236
-    int err;
237
-
238
-    /* Get the base address */
239
-    err = pci_device_cfg_read_u32( dev, &addr, bar );
240
-    if (err != 0)
241
-	return err;
242
-
243
-    /*
244
-     * We are going to be doing evil things to the registers here
245
-     * so disable them via the command register first.
246
-     */
247
-    err = pci_device_cfg_read_u16( dev, &cmd, PCIR_COMMAND );
248
-    if (err != 0)
249
-	return err;
250
-
251
-    err = pci_device_cfg_write_u16( dev,
252
-	cmd & ~(PCI_BAR_MEM(addr) ? PCIM_CMD_MEMEN : PCIM_CMD_PORTEN),
253
-	PCIR_COMMAND );
254
-    if (err != 0)
255
-	return err;
256
-
257
-    /* Test write all ones to the register, then restore it. */
258
-    err = pci_device_cfg_write_u32( dev, 0xffffffff, bar );
259
-    if (err != 0)
260
-	return err;
261
-    err = pci_device_cfg_read_u32( dev, &testval, bar );
262
-    if (err != 0)
263
-	return err;
264
-    err = pci_device_cfg_write_u32( dev, addr, bar );
265
-    if (err != 0)
266
-	return err;
267
-
268
-    /* Restore the command register */
269
-    err = pci_device_cfg_write_u16( dev, cmd, PCIR_COMMAND );
270
-    if (err != 0)
271
-	return err;
272
-
273
-    if (addr & 0x01)
274
-	dev->regions[region].is_IO = 1;
275
-    if (addr & 0x04)
276
-	dev->regions[region].is_64 = 1;
277
-    if (addr & 0x08)
278
-	dev->regions[region].is_prefetchable = 1;
279
-
280
-    /* Set the size */
281
-    dev->regions[region].size = get_test_val_size( testval );
282
-	printf("size = 0x%lx\n", (long)dev->regions[region].size);
283
-
284
-    /* Set the base address value */
285
-    if (dev->regions[region].is_64) {
286
-	uint32_t top;
287
-
288
-	err = pci_device_cfg_read_u32( dev, &top, bar + 4 );
289
-	if (err != 0)
290
-	    return err;
291
-
292
-	dev->regions[region].base_addr = ((uint64_t)top << 32) |
293
-					  get_map_base(addr);
294
-    } else {
295
-	dev->regions[region].base_addr = get_map_base(addr);
296
+    io.pi_sel.pc_domain = dev->domain;
297
+    io.pi_sel.pc_bus = dev->bus;
298
+    io.pi_sel.pc_dev = dev->dev;
299
+    io.pi_sel.pc_func = dev->func;
300
+    
301
+    if ( ioctl( freebsd_pci_sys->pcidev, PCIOCATTACHED, &io ) < 0 ) {
302
+	return 0;
303
     }
304
 
305
-    return 0;
306
+    /* if io.pi_data is 0, no driver is attached */
307
+    return io.pi_data == 0 ? 0 : 1;
308
 }
309
 
310
-static int
311
-pci_device_freebsd_probe( struct pci_device * dev )
312
+static struct pci_io_handle *
313
+pci_device_freebsd_open_legacy_io( struct pci_io_handle *ret,
314
+				   struct pci_device *dev, pciaddr_t base,
315
+				   pciaddr_t size )
316
 {
317
-    struct pci_device_private *priv = (struct pci_device_private *) dev;
318
-    uint32_t reg, size;
319
-    uint8_t irq;
320
-    int err, i, bar;
321
-
322
-    /* Many of the fields were filled in during initial device enumeration.
323
-     * At this point, we need to fill in regions, rom_size, and irq.
324
-     */
325
-
326
-    err = pci_device_cfg_read_u8( dev, &irq, 60 );
327
-    if (err)
328
-	return errno;
329
-    dev->irq = irq;
330
-
331
-    bar = 0x10;
332
-    for (i = 0; i < pci_device_freebsd_get_num_regions( dev ); i++) {
333
-	pci_device_freebsd_get_region_info( dev, i, bar );
334
-	if (dev->regions[i].is_64) {
335
-	    bar += 0x08;
336
-	    i++;
337
-	} else
338
-	    bar += 0x04;
339
-    }
340
-
341
-    /* If it's a VGA device, set up the rom size for read_rom */
342
-    if ((dev->device_class & 0x00ffff00) ==
343
-	((PCIC_DISPLAY << 16) | (PCIS_DISPLAY_VGA << 8)))
344
-    {
345
-	err = pci_device_cfg_read_u32( dev, &reg, PCIR_BIOS );
346
-	if (err)
347
-	    return errno;
348
-
349
-	if (reg == 0) {
350
-	    dev->rom_size = 0x10000;
351
-	    return 0;
352
-	}
353
-
354
-	err = pci_device_cfg_write_u32( dev, ~PCIM_BIOS_ENABLE, PCIR_BIOS );
355
-	if (err)
356
-	    return errno;
357
-	pci_device_cfg_read_u32( dev, &size, PCIR_BIOS );
358
-	pci_device_cfg_write_u32( dev, reg, PCIR_BIOS );
359
-
360
-	if ((reg & PCIM_BIOS_ADDR_MASK) != 0) {
361
-	    priv->rom_base = (reg & PCIM_BIOS_ADDR_MASK);
362
-	    dev->rom_size = -(size & PCIM_BIOS_ADDR_MASK);
363
-	}
364
-    }
365
-
366
-    return 0;
367
-}
368
-
369
+#if defined(__sparc64__)
370
+    ret->memory = mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
371
+	screenfd, base );
372
+    if ( ret->memory == MAP_FAILED )
373
+	return NULL;
374
+#else
375
+    ret->fd = open( "/dev/io", O_RDWR | O_CLOEXEC );
376
+    if ( ret->fd < 0 )
377
+	return NULL;
378
 #endif
379
-
380
-static void
381
-pci_system_freebsd_destroy(void)
382
-{
383
-    close(freebsd_pci_sys->pcidev);
384
-    free(freebsd_pci_sys->pci_sys.devices);
385
-    freebsd_pci_sys = NULL;
386
+    ret->base = base;
387
+    ret->size = size;
388
+    ret->is_legacy = 1;
389
+    return ret;
390
 }
391
 
392
-#if defined(__i386__) || defined(__amd64__)
393
-#include <machine/cpufunc.h>
394
-#endif
395
-
396
 static struct pci_io_handle *
397
-pci_device_freebsd_open_legacy_io(struct pci_io_handle *ret,
398
-    struct pci_device *dev, pciaddr_t base, pciaddr_t size)
399
+pci_device_freebsd_open_io( struct pci_io_handle *ret,
400
+			    struct pci_device *dev, int bar,
401
+			    pciaddr_t base, pciaddr_t size )
402
 {
403
-#if defined(__i386__) || defined(__amd64__)
404
-	ret->fd = open("/dev/io", O_RDWR | O_CLOEXEC);
405
-
406
-	if (ret->fd < 0)
407
-		return NULL;
408
-
409
-	ret->base = base;
410
-	ret->size = size;
411
-	ret->is_legacy = 1;
412
-	return ret;
413
-#elif defined(PCI_MAGIC_IO_RANGE)
414
-	ret->memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
415
-	    aperturefd, PCI_MAGIC_IO_RANGE + base);
416
-	if (ret->memory == MAP_FAILED)
417
-		return NULL;
418
-
419
-	ret->base = base;
420
-	ret->size = size;
421
-	ret->is_legacy = 1;
422
-	return ret;
423
-#else
424
-	return NULL;
425
-#endif
426
+    ret = pci_device_freebsd_open_legacy_io( ret, dev, base, size );
427
+    if ( ret != NULL )
428
+	ret->is_legacy = 0;
429
+    return ret;
430
 }
431
 
432
-#if defined(__i386__) || defined(__amd64__)
433
 static void
434
-pci_device_freebsd_close_io(struct pci_device *dev, struct pci_io_handle *handle)
435
+pci_device_freebsd_close_io( struct pci_device *dev,
436
+			     struct pci_io_handle *handle )
437
 {
438
-	if (handle->fd > -1)
439
-		close(handle->fd);
440
-}
441
+#if !defined(__sparc64__)
442
+    if ( handle->fd > -1 )
443
+	close( handle->fd );
444
 #endif
445
+}
446
 
447
 static uint32_t
448
-pci_device_freebsd_read32(struct pci_io_handle *handle, uint32_t reg)
449
+pci_device_freebsd_read32( struct pci_io_handle *handle, uint32_t reg )
450
 {
451
-#if defined(__i386__) || defined(__amd64__)
452
-	return inl(handle->base + reg);
453
+#if defined(__sparc64__)
454
+    return *(uint32_t *)((uintptr_t)handle->memory + reg);
455
+#elif defined(__i386__) || defined(__amd64__)
456
+    return inl( handle->base + reg );
457
 #else
458
-	return *(uint32_t *)((uintptr_t)handle->memory + reg);
459
+    struct iodev_pio_req req = { IODEV_PIO_READ, handle->base + reg, 4, 0 };
460
+    if ( handle->fd > -1 )
461
+	ioctl( handle->fd, IODEV_PIO, &req );
462
+    return req.val;
463
 #endif
464
 }
465
 
466
 static uint16_t
467
-pci_device_freebsd_read16(struct pci_io_handle *handle, uint32_t reg)
468
+pci_device_freebsd_read16( struct pci_io_handle *handle, uint32_t reg )
469
 {
470
-#if defined(__i386__) || defined(__amd64__)
471
-	return inw(handle->base + reg);
472
+#if defined(__sparc64__)
473
+    return *(uint16_t *)((uintptr_t)handle->memory + reg);
474
+#elif defined(__i386__) || defined(__amd64__)
475
+    return inw( handle->base + reg );
476
 #else
477
-	return *(uint16_t *)((uintptr_t)handle->memory + reg);
478
+    struct iodev_pio_req req = { IODEV_PIO_READ, handle->base + reg, 2, 0 };
479
+    if ( handle->fd > -1 )
480
+	ioctl( handle->fd, IODEV_PIO, &req );
481
+    return req.val;
482
 #endif
483
 }
484
 
485
 static uint8_t
486
-pci_device_freebsd_read8(struct pci_io_handle *handle, uint32_t reg)
487
+pci_device_freebsd_read8( struct pci_io_handle *handle, uint32_t reg )
488
 {
489
-#if defined(__i386__) || defined(__amd64__)
490
-	return inb(handle->base + reg);
491
+#if defined(__sparc64__)
492
+    return *(uint8_t *)((uintptr_t)handle->memory + reg);
493
+#elif defined(__i386__) || defined(__amd64__)
494
+    return inb( handle->base + reg );
495
 #else
496
-	return *(uint8_t *)((uintptr_t)handle->memory + reg);
497
+    struct iodev_pio_req req = { IODEV_PIO_READ, handle->base + reg, 1, 0 };
498
+    if ( handle->fd > -1 )
499
+	ioctl( handle->fd, IODEV_PIO, &req );
500
+    return req.val;
501
 #endif
502
 }
503
 
504
 static void
505
-pci_device_freebsd_write32(struct pci_io_handle *handle, uint32_t reg,
506
-    uint32_t data)
507
+pci_device_freebsd_write32( struct pci_io_handle *handle, uint32_t reg,
508
+			    uint32_t data )
509
 {
510
-#if defined(__i386__) || defined(__amd64__)
511
-	outl(handle->base + reg, data);
512
+#if defined(__sparc64__)
513
+    *(uint32_t *)((uintptr_t)handle->memory + reg) = data;
514
+#elif defined(__i386__) || defined(__amd64__)
515
+    outl( handle->base + reg, data );
516
 #else
517
-	*(uint16_t *)((uintptr_t)handle->memory + reg) = data;
518
+    struct iodev_pio_req req = { IODEV_PIO_WRITE, handle->base + reg, 4, data };
519
+    if ( handle->fd > -1 )
520
+	ioctl( handle->fd, IODEV_PIO, &req );
521
 #endif
522
 }
523
 
524
 static void
525
-pci_device_freebsd_write16(struct pci_io_handle *handle, uint32_t reg,
526
-    uint16_t data)
527
+pci_device_freebsd_write16( struct pci_io_handle *handle, uint32_t reg,
528
+			    uint16_t data )
529
 {
530
-#if defined(__i386__) || defined(__amd64__)
531
-	outw(handle->base + reg, data);
532
+#if defined(__sparc64__)
533
+    *(uint16_t *)((uintptr_t)handle->memory + reg) = data;
534
+#elif defined(__i386__) || defined(__amd64__)
535
+    outw( handle->base + reg, data );
536
 #else
537
-	*(uint8_t *)((uintptr_t)handle->memory + reg) = data;
538
+    struct iodev_pio_req req = { IODEV_PIO_WRITE, handle->base + reg, 2, data };
539
+    if ( handle->fd > -1 )
540
+	ioctl( handle->fd, IODEV_PIO, &req );
541
 #endif
542
 }
543
 
544
 static void
545
-pci_device_freebsd_write8(struct pci_io_handle *handle, uint32_t reg,
546
-    uint8_t data)
547
+pci_device_freebsd_write8( struct pci_io_handle *handle, uint32_t reg,
548
+			   uint8_t data )
549
 {
550
-#if defined(__i386__) || defined(__amd64__)
551
-	outb(handle->base + reg, data);
552
+#if defined(__sparc64__)
553
+    *(uint8_t *)((uintptr_t)handle->memory + reg) = data;
554
+#elif defined(__i386__) || defined(__amd64__)
555
+    outb( handle->base + reg, data );
556
 #else
557
-	*(uint32_t *)((uintptr_t)handle->memory + reg) = data;
558
+    struct iodev_pio_req req = { IODEV_PIO_WRITE, handle->base + reg, 1, data };
559
+    if ( handle->fd > -1 )
560
+	ioctl( handle->fd, IODEV_PIO, &req );
561
 #endif
562
 }
563
 
564
 static int
565
-pci_device_freebsd_map_legacy(struct pci_device *dev, pciaddr_t base,
566
-    pciaddr_t size, unsigned map_flags, void **addr)
567
+pci_device_freebsd_map_legacy( struct pci_device *dev, pciaddr_t base,
568
+			       pciaddr_t size, unsigned map_flags, void **addr )
569
 {
570
-	struct pci_device_mapping map;
571
-	int err;
572
+    struct pci_device_mapping map;
573
+    int err;
574
 
575
-	map.base = base;
576
-	map.size = size;
577
-	map.flags = map_flags;
578
-	map.memory = NULL;
579
-	err = pci_device_freebsd_map_range(dev, &map);
580
-	*addr = map.memory;
581
+    map.base = base;
582
+    map.size = size;
583
+    map.flags = map_flags;
584
+    map.memory = NULL;
585
+    err = pci_device_freebsd_map_range( dev, &map );
586
+    *addr = map.memory;
587
 
588
-	return err;
589
+    return err;
590
 }
591
 
592
 static int
593
-pci_device_freebsd_unmap_legacy(struct pci_device *dev, void *addr,
594
-    pciaddr_t size)
595
+pci_device_freebsd_unmap_legacy( struct pci_device *dev, void *addr,
596
+				 pciaddr_t size )
597
 {
598
-	struct pci_device_mapping map;
599
+    struct pci_device_mapping map;
600
 
601
-	map.memory = addr;
602
-	map.size = size;
603
-	map.flags = 0;
604
-	return pci_device_freebsd_unmap_range(dev, &map);
605
+    map.memory = addr;
606
+    map.size = size;
607
+    map.flags = 0;
608
+    return pci_device_freebsd_unmap_range( dev, &map );
609
 }
610
 
611
 static const struct pci_system_methods freebsd_pci_methods = {
612
@@ -707,19 +607,25 @@ static const struct pci_system_methods freebsd_pci_met
613
     .probe = pci_device_freebsd_probe,
614
     .map_range = pci_device_freebsd_map_range,
615
     .unmap_range = pci_device_freebsd_unmap_range,
616
+
617
     .read = pci_device_freebsd_read,
618
     .write = pci_device_freebsd_write,
619
+
620
     .fill_capabilities = pci_fill_capabilities_generic,
621
+    .enable = NULL,
622
+    .boot_vga = NULL,
623
+    .has_kernel_driver = pci_device_freebsd_has_kernel_driver,
624
+
625
+    .open_device_io = pci_device_freebsd_open_io,
626
     .open_legacy_io = pci_device_freebsd_open_legacy_io,
627
-#if defined(__i386__) || defined(__amd64__)
628
     .close_io = pci_device_freebsd_close_io,
629
-#endif
630
     .read32 = pci_device_freebsd_read32,
631
     .read16 = pci_device_freebsd_read16,
632
     .read8 = pci_device_freebsd_read8,
633
     .write32 = pci_device_freebsd_write32,
634
     .write16 = pci_device_freebsd_write16,
635
     .write8 = pci_device_freebsd_write8,
636
+
637
     .map_legacy = pci_device_freebsd_map_legacy,
638
     .unmap_legacy = pci_device_freebsd_unmap_legacy,
639
 };
640
@@ -775,11 +681,7 @@ pci_system_freebsd_create( void )
641
     for ( i = 0; i < pciconfio.num_matches; i++ ) {
642
 	struct pci_conf *p = &pciconf[ i ];
643
 
644
-#if HAVE_PCI_IO_PC_DOMAIN
645
 	pci_sys->devices[ i ].base.domain = p->pc_sel.pc_domain;
646
-#else
647
-	pci_sys->devices[ i ].base.domain = 0;
648
-#endif
649
 	pci_sys->devices[ i ].base.bus = p->pc_sel.pc_bus;
650
 	pci_sys->devices[ i ].base.dev = p->pc_sel.pc_dev;
651
 	pci_sys->devices[ i ].base.func = p->pc_sel.pc_func;
652
@@ -794,4 +696,12 @@ pci_system_freebsd_create( void )
653
     }
654
 
655
     return 0;
656
+}
657
+
658
+void
659
+pci_system_freebsd_init_dev_mem(int fd)
660
+{
661
+#if defined(__sparc64__)
662
+    screenfd = fd;
663
+#endif
664
 }
(-)a/devel/libpciaccess/files/patch-src-pciaccess_private.h (-10 lines)
Removed Link Here
1
--- src/pciaccess_private.h.orig	2015-02-03 23:59:14 UTC
2
+++ src/pciaccess_private.h
3
@@ -185,6 +185,7 @@ extern struct pci_system * pci_sys;
4
 
5
 extern int pci_system_linux_sysfs_create( void );
6
 extern int pci_system_freebsd_create( void );
7
+extern void pci_system_freebsd_init_dev_mem( int );
8
 extern int pci_system_netbsd_create( void );
9
 extern int pci_system_openbsd_create( void );
10
 extern void pci_system_openbsd_init_dev_mem( int );
(-)b/devel/libpciaccess/files/patch-src_freebsd__pci.c (+36 lines)
Added Link Here
1
--- src/freebsd_pci.c.orig	2019-07-17 16:25:27 UTC
2
+++ src/freebsd_pci.c
3
@@ -421,24 +421,6 @@ pci_system_freebsd_destroy( void )
4
     freebsd_pci_sys = NULL;
5
 }
6
 
7
-static int
8
-pci_device_freebsd_has_kernel_driver( struct pci_device *dev )
9
-{
10
-    struct pci_io io;
11
-
12
-    io.pi_sel.pc_domain = dev->domain;
13
-    io.pi_sel.pc_bus = dev->bus;
14
-    io.pi_sel.pc_dev = dev->dev;
15
-    io.pi_sel.pc_func = dev->func;
16
-    
17
-    if ( ioctl( freebsd_pci_sys->pcidev, PCIOCATTACHED, &io ) < 0 ) {
18
-	return 0;
19
-    }
20
-
21
-    /* if io.pi_data is 0, no driver is attached */
22
-    return io.pi_data == 0 ? 0 : 1;
23
-}
24
-
25
 static struct pci_io_handle *
26
 pci_device_freebsd_open_legacy_io( struct pci_io_handle *ret,
27
 				   struct pci_device *dev, pciaddr_t base,
28
@@ -614,7 +596,7 @@ static const struct pci_system_methods freebsd_pci_met
29
     .fill_capabilities = pci_fill_capabilities_generic,
30
     .enable = NULL,
31
     .boot_vga = NULL,
32
-    .has_kernel_driver = pci_device_freebsd_has_kernel_driver,
33
+    .has_kernel_driver = NULL,
34
 
35
     .open_device_io = pci_device_freebsd_open_io,
36
     .open_legacy_io = pci_device_freebsd_open_legacy_io,

Return to bug 239065