Added device_is_agp callback to drm_driver. This function is called by the
platform-specific drm_device_is_agp function. Added implementation of this function the the Linux-specific portion of the MGA driver to detect PCI G450 cards. Added code to the Linux-specific portion of the generic DRM layer to not initialize AGP infrastructure if the card is not AGP (this matches what already existed in BSD). Bumped the driver date and the driver patch-level for MGA. This mostly fixes bugzilla #3248. The BSD side still needs an implementation of mga_driver_device_is_agp.main
parent
bd72c6990f
commit
e051cd19c0
|
@ -638,6 +638,18 @@ struct drm_device {
|
||||||
void (*irq_handler)(DRM_IRQ_ARGS);
|
void (*irq_handler)(DRM_IRQ_ARGS);
|
||||||
int (*vblank_wait)(drm_device_t *dev, unsigned int *sequence);
|
int (*vblank_wait)(drm_device_t *dev, unsigned int *sequence);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by \c drm_device_is_agp. Typically used to determine if a
|
||||||
|
* card is really attached to AGP or not.
|
||||||
|
*
|
||||||
|
* \param dev DRM device handle
|
||||||
|
*
|
||||||
|
* \returns true if the card really is attached to AGP, false
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
int (*device_is_agp) (struct drm_device * dev);
|
||||||
|
|
||||||
|
|
||||||
drm_ioctl_desc_t *driver_ioctls;
|
drm_ioctl_desc_t *driver_ioctls;
|
||||||
int max_driver_ioctl;
|
int max_driver_ioctl;
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,12 @@ drm_device_is_agp(drm_device_t *dev)
|
||||||
u_int32_t status;
|
u_int32_t status;
|
||||||
u_int8_t ptr, next;
|
u_int8_t ptr, next;
|
||||||
|
|
||||||
|
|
||||||
|
if ( (dev->driver->device_is_agp != NULL)
|
||||||
|
&& ! (*dev->driver->device_is_agp)( dev ) ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check the CAP_LIST bit of the PCI status register first.
|
* Check the CAP_LIST bit of the PCI status register first.
|
||||||
*/
|
*/
|
||||||
|
@ -71,6 +77,11 @@ drm_device_is_agp(drm_device_t *dev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
|
if ( (dev->driver->device_is_agp != NULL)
|
||||||
|
&& ! (*dev->driver->device_is_agp)( dev ) ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX: fill me in for non-FreeBSD */
|
/* XXX: fill me in for non-FreeBSD */
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -37,11 +37,14 @@
|
||||||
#include "mga_drv.h"
|
#include "mga_drv.h"
|
||||||
#include "drm_pciids.h"
|
#include "drm_pciids.h"
|
||||||
|
|
||||||
|
int mga_driver_device_is_agp(drm_device_t * dev)
|
||||||
/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */
|
/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */
|
||||||
static drm_pci_id_list_t mga_pciidlist[] = {
|
static drm_pci_id_list_t mga_pciidlist[] = {
|
||||||
mga_PCI_IDS
|
mga_PCI_IDS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int mga_driver_device_is_agp(drm_device_t * dev);
|
||||||
|
|
||||||
extern drm_ioctl_desc_t mga_ioctls[];
|
extern drm_ioctl_desc_t mga_ioctls[];
|
||||||
extern int mga_max_ioctl;
|
extern int mga_max_ioctl;
|
||||||
|
|
||||||
|
@ -58,6 +61,8 @@ static void mga_configure(drm_device_t *dev)
|
||||||
dev->dma_ioctl = mga_dma_buffers;
|
dev->dma_ioctl = mga_dma_buffers;
|
||||||
dev->dma_quiescent = mga_driver_dma_quiescent;
|
dev->dma_quiescent = mga_driver_dma_quiescent;
|
||||||
|
|
||||||
|
dev->device_is_agp = mga_driver_device_is_agp;
|
||||||
|
|
||||||
dev->driver_ioctls = mga_ioctls;
|
dev->driver_ioctls = mga_ioctls;
|
||||||
dev->max_driver_ioctl = mga_max_ioctl;
|
dev->max_driver_ioctl = mga_max_ioctl;
|
||||||
|
|
||||||
|
@ -76,6 +81,28 @@ static void mga_configure(drm_device_t *dev)
|
||||||
dev->use_vbl_irq = 1;
|
dev->use_vbl_irq = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the device really is AGP or not.
|
||||||
|
*
|
||||||
|
* In addition to the usual tests performed by \c drm_device_is_agp, this
|
||||||
|
* function detects PCI G450 cards that appear to the system exactly like
|
||||||
|
* AGP G450 cards.
|
||||||
|
*
|
||||||
|
* \param dev The device to be tested.
|
||||||
|
*
|
||||||
|
* \returns
|
||||||
|
* If the device is a PCI G450, zero is returned. Otherwise non-zero is
|
||||||
|
* returned.
|
||||||
|
*
|
||||||
|
* \bug
|
||||||
|
* This function needs to be filled in! The implementation in
|
||||||
|
* linux-core/mga_drv.c shows what needs to be done.
|
||||||
|
*/
|
||||||
|
int mga_driver_device_is_agp(drm_device_t * dev)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
static int
|
static int
|
||||||
mga_probe(device_t dev)
|
mga_probe(device_t dev)
|
||||||
|
|
|
@ -541,6 +541,18 @@ struct drm_driver {
|
||||||
int new);
|
int new);
|
||||||
int (*kernel_context_switch_unlock) (struct drm_device * dev);
|
int (*kernel_context_switch_unlock) (struct drm_device * dev);
|
||||||
int (*vblank_wait) (struct drm_device * dev, unsigned int *sequence);
|
int (*vblank_wait) (struct drm_device * dev, unsigned int *sequence);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by \c drm_device_is_agp. Typically used to determine if a
|
||||||
|
* card is really attached to AGP or not.
|
||||||
|
*
|
||||||
|
* \param dev DRM device handle
|
||||||
|
*
|
||||||
|
* \returns true if the card really is attached to AGP, false
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
int (*device_is_agp) (struct drm_device * dev);
|
||||||
|
|
||||||
/* these have to be filled in */
|
/* these have to be filled in */
|
||||||
int (*postinit) (struct drm_device *, unsigned long flags);
|
int (*postinit) (struct drm_device *, unsigned long flags);
|
||||||
irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
|
irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
|
||||||
|
@ -1016,6 +1028,11 @@ static __inline__ struct drm_map *drm_core_findmap(struct drm_device *dev,
|
||||||
|
|
||||||
static __inline__ int drm_device_is_agp(drm_device_t *dev)
|
static __inline__ int drm_device_is_agp(drm_device_t *dev)
|
||||||
{
|
{
|
||||||
|
if ( (dev->driver->device_is_agp != NULL)
|
||||||
|
&& ! (*dev->driver->device_is_agp)( dev ) ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
|
return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,8 @@ static int fill_in_dev(drm_device_t * dev, struct pci_dev *pdev,
|
||||||
goto error_out_unreg;
|
goto error_out_unreg;
|
||||||
|
|
||||||
if (drm_core_has_AGP(dev)) {
|
if (drm_core_has_AGP(dev)) {
|
||||||
dev->agp = drm_agp_init(dev);
|
if (drm_device_is_agp(dev))
|
||||||
|
dev->agp = drm_agp_init(dev);
|
||||||
if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP)
|
if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP)
|
||||||
&& (dev->agp == NULL)) {
|
&& (dev->agp == NULL)) {
|
||||||
DRM_ERROR("Cannot initialize the agpgart module.\n");
|
DRM_ERROR("Cannot initialize the agpgart module.\n");
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
#include "drm_pciids.h"
|
#include "drm_pciids.h"
|
||||||
|
|
||||||
|
static int mga_driver_device_is_agp(drm_device_t * dev);
|
||||||
static int postinit(struct drm_device *dev, unsigned long flags)
|
static int postinit(struct drm_device *dev, unsigned long flags)
|
||||||
{
|
{
|
||||||
dev->counters += 3;
|
dev->counters += 3;
|
||||||
|
@ -82,6 +83,7 @@ static struct drm_driver driver = {
|
||||||
DRIVER_IRQ_VBL,
|
DRIVER_IRQ_VBL,
|
||||||
.pretakedown = mga_driver_pretakedown,
|
.pretakedown = mga_driver_pretakedown,
|
||||||
.dma_quiescent = mga_driver_dma_quiescent,
|
.dma_quiescent = mga_driver_dma_quiescent,
|
||||||
|
.device_is_agp = mga_driver_device_is_agp,
|
||||||
.vblank_wait = mga_driver_vblank_wait,
|
.vblank_wait = mga_driver_vblank_wait,
|
||||||
.irq_preinstall = mga_driver_irq_preinstall,
|
.irq_preinstall = mga_driver_irq_preinstall,
|
||||||
.irq_postinstall = mga_driver_irq_postinstall,
|
.irq_postinstall = mga_driver_irq_postinstall,
|
||||||
|
@ -134,3 +136,44 @@ module_exit(mga_exit);
|
||||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||||
MODULE_LICENSE("GPL and additional rights");
|
MODULE_LICENSE("GPL and additional rights");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the device really is AGP or not.
|
||||||
|
*
|
||||||
|
* In addition to the usual tests performed by \c drm_device_is_agp, this
|
||||||
|
* function detects PCI G450 cards that appear to the system exactly like
|
||||||
|
* AGP G450 cards.
|
||||||
|
*
|
||||||
|
* \param dev The device to be tested.
|
||||||
|
*
|
||||||
|
* \returns
|
||||||
|
* If the device is a PCI G450, zero is returned. Otherwise non-zero is
|
||||||
|
* returned.
|
||||||
|
*/
|
||||||
|
int mga_driver_device_is_agp(drm_device_t * dev)
|
||||||
|
{
|
||||||
|
const struct pci_dev * const pdev = dev->pdev;
|
||||||
|
|
||||||
|
|
||||||
|
/* There are PCI versions of the G450. These cards have the
|
||||||
|
* same PCI ID as the AGP G450, but have an additional PCI-to-PCI
|
||||||
|
* bridge chip. We detect these cards, which are not currently
|
||||||
|
* supported by this driver, by looking at the device ID of the
|
||||||
|
* bus the "card" is on. If vendor is 0x3388 (Hint Corp) and the
|
||||||
|
* device is 0x0021 (HB6 Universal PCI-PCI bridge), we reject the
|
||||||
|
* device.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( (pdev->device == 0x0525)
|
||||||
|
&& (pdev->bus->self->vendor == 0x3388)
|
||||||
|
&& (pdev->bus->self->device == 0x0021) ) {
|
||||||
|
#if defined( __powerpc__ )
|
||||||
|
DRM_ERROR("GXT135p is not yet supported\n");
|
||||||
|
#else
|
||||||
|
DRM_ERROR("PCI G450 is not yet supported\n");
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -38,11 +38,11 @@
|
||||||
|
|
||||||
#define DRIVER_NAME "mga"
|
#define DRIVER_NAME "mga"
|
||||||
#define DRIVER_DESC "Matrox G200/G400"
|
#define DRIVER_DESC "Matrox G200/G400"
|
||||||
#define DRIVER_DATE "20021029"
|
#define DRIVER_DATE "20051013"
|
||||||
|
|
||||||
#define DRIVER_MAJOR 3
|
#define DRIVER_MAJOR 3
|
||||||
#define DRIVER_MINOR 1
|
#define DRIVER_MINOR 1
|
||||||
#define DRIVER_PATCHLEVEL 0
|
#define DRIVER_PATCHLEVEL 1
|
||||||
|
|
||||||
typedef struct drm_mga_primary_buffer {
|
typedef struct drm_mga_primary_buffer {
|
||||||
u8 *start;
|
u8 *start;
|
||||||
|
|
Loading…
Reference in New Issue