17965d9acSmrg/*
27965d9acSmrg * Copyright 2007 George Sapountzis
37965d9acSmrg *
47965d9acSmrg * Permission is hereby granted, free of charge, to any person obtaining a
57965d9acSmrg * copy of this software and associated documentation files (the "Software"),
67965d9acSmrg * to deal in the Software without restriction, including without limitation
77965d9acSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
87965d9acSmrg * and/or sell copies of the Software, and to permit persons to whom the
97965d9acSmrg * Software is furnished to do so, subject to the following conditions:
107965d9acSmrg *
117965d9acSmrg * The above copyright notice and this permission notice (including the next
127965d9acSmrg * paragraph) shall be included in all copies or substantial portions of the
137965d9acSmrg * Software.
147965d9acSmrg *
157965d9acSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167965d9acSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177965d9acSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
187965d9acSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
197965d9acSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
207965d9acSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
217965d9acSmrg * SOFTWARE.
227965d9acSmrg */
237965d9acSmrg
247965d9acSmrg/**
257965d9acSmrg * Macros for porting drivers from legacy xfree86 PCI code to the pciaccess
267965d9acSmrg * library. The main purpose being to facilitate source code compatibility.
277965d9acSmrg */
287965d9acSmrg
297965d9acSmrg#ifndef I128PCIRENAME_H
307965d9acSmrg#define I128PCIRENAME_H
317965d9acSmrg
327965d9acSmrgenum region_type {
337965d9acSmrg    REGION_MEM,
347965d9acSmrg    REGION_IO
357965d9acSmrg};
367965d9acSmrg
377965d9acSmrg#ifndef XSERVER_LIBPCIACCESS
387965d9acSmrg
397965d9acSmrg/* pciVideoPtr */
407965d9acSmrg#define PCI_DEV_VENDOR_ID(_pcidev) ((_pcidev)->vendor)
417965d9acSmrg#define PCI_DEV_DEVICE_ID(_pcidev) ((_pcidev)->chipType)
427965d9acSmrg#define PCI_DEV_REVISION(_pcidev)  ((_pcidev)->chipRev)
437965d9acSmrg
447965d9acSmrg#define PCI_SUB_VENDOR_ID(_pcidev) ((_pcidev)->subsysVendor)
457965d9acSmrg#define PCI_SUB_DEVICE_ID(_pcidev) ((_pcidev)->subsysCard)
467965d9acSmrg
477965d9acSmrg#define PCI_DEV_TAG(_pcidev) pciTag((_pcidev)->bus,    \
487965d9acSmrg                                    (_pcidev)->device, \
497965d9acSmrg                                    (_pcidev)->func)
507965d9acSmrg#define PCI_DEV_BUS(_pcidev)       ((_pcidev)->bus)
517965d9acSmrg#define PCI_DEV_DEV(_pcidev)       ((_pcidev)->device)
527965d9acSmrg#define PCI_DEV_FUNC(_pcidev)      ((_pcidev)->func)
537965d9acSmrg
547965d9acSmrg/* pciConfigPtr */
557965d9acSmrg#define PCI_CFG_TAG(_pcidev)  (((pciConfigPtr)(_pcidev)->thisCard)->tag)
567965d9acSmrg#define PCI_CFG_BUS(_pcidev)  (((pciConfigPtr)(_pcidev)->thisCard)->busnum)
577965d9acSmrg#define PCI_CFG_DEV(_pcidev)  (((pciConfigPtr)(_pcidev)->thisCard)->devnum)
587965d9acSmrg#define PCI_CFG_FUNC(_pcidev) (((pciConfigPtr)(_pcidev)->thisCard)->funcnum)
597965d9acSmrg
607965d9acSmrg/* region addr: xfree86 uses different fields for memory regions and I/O ports */
617965d9acSmrg#define PCI_REGION_BASE(_pcidev, _b, _type)             \
627965d9acSmrg    (((_type) == REGION_MEM) ? (_pcidev)->memBase[(_b)] \
637965d9acSmrg                             : (_pcidev)->ioBase[(_b)])
647965d9acSmrg
657965d9acSmrg/* region size: xfree86 uses the log2 of the region size,
667965d9acSmrg * but with zero meaning no region, not size of one XXX */
677965d9acSmrg#define PCI_REGION_SIZE(_pcidev, _b) \
687965d9acSmrg    (((_pcidev)->size[(_b)] > 0) ? (1 << (_pcidev)->size[(_b)]) : 0)
697965d9acSmrg
707965d9acSmrg/* read/write PCI configuration space */
717965d9acSmrg#define PCI_READ_BYTE(_pcidev, _value_ptr, _offset) \
727965d9acSmrg    *(_value_ptr) = pciReadByte(PCI_CFG_TAG(_pcidev), (_offset))
737965d9acSmrg
747965d9acSmrg#define PCI_READ_LONG(_pcidev, _value_ptr, _offset) \
757965d9acSmrg    *(_value_ptr) = pciReadLong(PCI_CFG_TAG(_pcidev), (_offset))
767965d9acSmrg
777965d9acSmrg#define PCI_WRITE_LONG(_pcidev, _value, _offset) \
787965d9acSmrg    pciWriteLong(PCI_CFG_TAG(_pcidev), (_offset), (_value))
797965d9acSmrg
807965d9acSmrg#else /* XSERVER_LIBPCIACCESS */
817965d9acSmrg
827965d9acSmrgtypedef struct pci_device *pciVideoPtr;
837965d9acSmrg
847965d9acSmrg#define PCI_DEV_VENDOR_ID(_pcidev) ((_pcidev)->vendor_id)
857965d9acSmrg#define PCI_DEV_DEVICE_ID(_pcidev) ((_pcidev)->device_id)
867965d9acSmrg#define PCI_DEV_REVISION(_pcidev)  ((_pcidev)->revision)
877965d9acSmrg
887965d9acSmrg#define PCI_SUB_VENDOR_ID(_pcidev) ((_pcidev)->subvendor_id)
897965d9acSmrg#define PCI_SUB_DEVICE_ID(_pcidev) ((_pcidev)->subdevice_id)
907965d9acSmrg
917965d9acSmrg/* pci-rework functions take a 'pci_device' parameter instead of a tag */
927965d9acSmrg#define PCI_DEV_TAG(_pcidev)        (_pcidev)
937965d9acSmrg
947965d9acSmrg/* PCI_DEV macros, typically used in printf's, add domain ? XXX */
957965d9acSmrg#define PCI_DEV_BUS(_pcidev)       ((_pcidev)->bus)
967965d9acSmrg#define PCI_DEV_DEV(_pcidev)       ((_pcidev)->dev)
977965d9acSmrg#define PCI_DEV_FUNC(_pcidev)      ((_pcidev)->func)
987965d9acSmrg
997965d9acSmrg/* pci-rework functions take a 'pci_device' parameter instead of a tag */
1007965d9acSmrg#define PCI_CFG_TAG(_pcidev)        (_pcidev)
1017965d9acSmrg
1027965d9acSmrg/* PCI_CFG macros, typically used in DRI init, contain the domain */
1037965d9acSmrg#define PCI_CFG_BUS(_pcidev)      (((_pcidev)->domain << 8) | \
1047965d9acSmrg                                    (_pcidev)->bus)
1057965d9acSmrg#define PCI_CFG_DEV(_pcidev)       ((_pcidev)->dev)
1067965d9acSmrg#define PCI_CFG_FUNC(_pcidev)      ((_pcidev)->func)
1077965d9acSmrg
1087965d9acSmrg#define PCI_REGION_BASE(_pcidev, _b, _type) ((_pcidev)->regions[(_b)].base_addr)
1097965d9acSmrg#define PCI_REGION_SIZE(_pcidev, _b)        ((_pcidev)->regions[(_b)].size)
1107965d9acSmrg
1117965d9acSmrg#define PCI_READ_BYTE(_pcidev, _value_ptr, _offset) \
1127965d9acSmrg    pci_device_cfg_read_u8((_pcidev), (_value_ptr), (_offset))
1137965d9acSmrg
1147965d9acSmrg#define PCI_READ_LONG(_pcidev, _value_ptr, _offset) \
1157965d9acSmrg    pci_device_cfg_read_u32((_pcidev), (_value_ptr), (_offset))
1167965d9acSmrg
1177965d9acSmrg#define PCI_WRITE_LONG(_pcidev, _value, _offset) \
1187965d9acSmrg    pci_device_cfg_write_u32((_pcidev), (_value), (_offset))
1197965d9acSmrg
1207965d9acSmrg#endif /* XSERVER_LIBPCIACCESS */
1217965d9acSmrg
1227965d9acSmrg#endif /* I128PCIRENAME_H */
123