/*
*/
/*
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
*
*/
#include "drmP.h"
#include "drm.h"
#include "radeon_drm.h"
#include "radeon_drv.h"
#include "drm_pciids.h"
#include "efb.h"
#include "efb_edid.h"
static void *radeon_statep;
extern struct cb_ops drm_cb_ops;
/* Little-endian mapping with strict ordering for registers */
};
void
{
}
int
{
/*
* setup mapping for later PCI config space access
*/
}
!= DDI_SUCCESS) {
DRM_ERROR("efb_attach: "
"PCI configuration space setup failed");
return (DDI_FAILURE);
}
DRM_ERROR("efb_attach: "
"Map registers failed");
return (DDI_FAILURE);
}
efb_priv->primary_stream = 0;
#if VIS_CONS_REV > 2
/*
* setup for coherent console
*/
DRM_ERROR("efb_attach: "
"Unable to set tem-support property");
return (DDI_FAILURE);
}
#endif
return (DDI_SUCCESS);
}
void
{
}
}
static void
int length)
{
int i;
#ifdef _BIG_ENDIAN
switch (length) {
case 1:
break;
case 2:
break;
case 4:
break;
case 8:
break;
default:
switch (i) {
case 0x00: case 0x02:
case 0x04: case 0x06:
case 0x2c: case 0x2e:
case 0x4e: case 0x50:
{
*(pBuf+1) =
*(pBuf+0) =
pBuf += 2;
break;
}
case 0x08: case 0x09:
case 0x0a: case 0x0b:
case 0x0c: case 0x0d:
case 0x0e: case 0x0f:
case 0x34: case 0x35:
case 0x36: case 0x37:
case 0x3c: case 0x3d:
case 0x3e: case 0x3f:
case 0x40: case 0x41:
case 0x42: case 0x43:
case 0x4c: case 0x4d:
case 0x53:
{
*pBuf =
pBuf += 1;
break;
}
case 0x52:
{
*pBuf =
pBuf += 1;
break;
}
default:
{
*(pBuf+3) =
*(pBuf+2) =
*(pBuf+1) =
*(pBuf+0) =
pBuf += 4;
break;
}
}
}
}
#endif /* _BIG_ENDIAN */
}
int
{
struct gfx_pci_cfg efb_pci_cfg;
sizeof (struct gfx_pci_cfg));
sizeof (efb_pci_cfg), mode)) {
return (EFAULT);
}
return (0);
}
int
{
!= DDI_SUCCESS) {
return (DDI_FAILURE);
}
return (DDI_SUCCESS);
}
void
{
}
}
int
{
struct gfx_identifier radeon_gfx_identifier = {
.flags = 0
};
char *buf;
int proplen;
sizeof (radeon_gfx_identifier.model_name));
}
sizeof (radeon_gfx_identifier.part_number));
}
sizeof (radeon_gfx_identifier), mode)) {
return (EFAULT);
}
return (0);
}
int
{
sizeof (struct gfx_video_mode), mode)) {
return (EFAULT);
}
#if VIS_CONS_REV > 2
#endif /* VIS_CONS_REV */
return (0);
}
int
{
sizeof (struct gfx_video_mode), mode)) {
return (EFAULT);
}
return (0);
}
int
{
int ret;
int stream = 0;
return (EFAULT);
}
/* validate head */
return (EINVAL);
}
/* map to the internal stream number */
stream--;
DRM_LOCK();
DRM_UNLOCK();
if (!ret) {
/* the 127th byte specifies the extension block count */
mode)) {
}
}
return (ret);
}
int
{
int stream;
int ret;
int length;
return (EFAULT);
}
if (length <= 0) {
return (EINVAL);
}
/* validate head */
return (EINVAL);
}
/* map to the internal stream number */
stream--;
#ifdef _MULTI_DATAMODEL
}
#endif /* _MULTI_DATAMODEL */
DRM_LOCK();
DRM_UNLOCK();
if (!ret) {
}
if (!ret) {
sizeof (gfx_edid_t), mode);
}
if (ret) {
}
return (ret);
}
/* default structure for FBIOGATTR ioctl */
0, /* owner */
25, 80, 1, /* w, h, depth */
256, /* colormap size */
0, /* total size */
},
0, /* flags */
{ 0 }, /* dev_specific */
{ -1, -1, -1, -1 }, /* Emulation types */
};
int
int *rvalp)
{
int unit;
int ret = 0;
return (DDI_FAILURE);
switch (cmd) {
#if VIS_CONS_REV > 2
case VIS_DEVINIT:
{
break;
}
case VIS_DEVFINI:
{
break;
}
case VIS_CONSDISPLAY:
{
break;
}
case VIS_CONSCURSOR:
{
break;
}
case VIS_CONSCOPY:
{
break;
}
case VIS_PUTCMAP:
{
break;
}
#endif /* VIS_CONS_REV */
case VIS_GETIDENTIFIER:
{
sizeof (struct vis_identifier), mode))
break;
}
case FBIOGATTR:
{
break;
}
case FBIOGTYPE:
{
break;
}
case FBIOGXINFO:
{
break;
}
case GFX_IOCTL_GET_IDENTIFIER:
{
break;
}
case GFX_IOCTL_GET_PCI_CONFIG:
{
break;
}
case GFX_IOCTL_SET_VIDEO_MODE:
{
break;
}
{
break;
}
{
break;
}
case GFX_IOCTL_GET_EDID:
{
break;
}
default:
{
break;
}
}
return (ret);
}
/*
* Read width, height, depth, etc. parameters from hardware into softc.
*/
static void
{
int v2;
}
/*
* Read width, height, depth, stride, pixfreq, h/v sync, fporch, bporch,
* freq parameters from hardware into softc.
*/
void
{
uint32_t v;
int v2;
return;
/*
* Stream 1
*/
v = regr(CRTC_GEN_CNTL);
v2 = (v & CRTC_GEN_CNTL__CRTC_PIX_WIDTH_MASK) >>
v = regr(CRTC_PITCH);
/*
* Stream 2
*/
v = regr(CRTC2_GEN_CNTL);
v2 = (v & CRTC_GEN_CNTL__CRTC_PIX_WIDTH_MASK) >>
v = regr(CRTC2_PITCH);
}
/*
* Write all pending entries in softc colormap to hardware
*/
void
{
/*
* if restoring the previous saved colormap entries,
* reset the flag
*/
if (cmap > 1)
keep = 0;
return;
v |= map<<5;
oflag = 0;
if (*flags) {
if (!oflag) {
}
v = ((*red << PALETTE_30_DATA__PALETTE_DATA_R__SHIFT)
regw(PALETTE_30_DATA, v);
}
flags++;
++red;
++green;
++blue;
}
}
/*
* Read hardware colormap into softc
*/
void
{
int idx, i;
return;
v |= map<<5;
v = regr(PALETTE_30_DATA);
(v & PALETTE_30_DATA__PALETTE_DATA_R_MASK) >>
(v & PALETTE_30_DATA__PALETTE_DATA_G_MASK) >>
(v & PALETTE_30_DATA__PALETTE_DATA_B_MASK) >>
}
}
/*
* Wait for draw engine idle. Return 1 on success, 0 on
* failure (busy bit never goes away)
*/
/* Let's try a much simpler loop */
int
{
long limit;
long dt;
for (limit = 10000;
;
}
return (DDI_SUCCESS);
}
/* Short loop timed out, make a slower loop up to 1 second */
for (limit = 1000000;
efb_delay(1);
}
return (DDI_SUCCESS);
}
return (DDI_FAILURE);
}
int
{
long limit;
long dt;
/* If it's already idle, nothing to do */
return (1);
}
/* OK, now reset the FIFO */
return (0); /* This is really amazingly bad */
}
return (0);
}
}
;
}
return (1);
}
/* Short loop timed out, make a slower loop up to 3 seconds */
for (limit = 1000000;
efb_delay(1);
}
return (1);
}
"efb: %s:%d: efb_wait_idle: idle timeout status=%x",
return (0); /* This is really amazingly bad */
}
return (1);
}
int
{
long limit;
long dt;
/* If it's already idle, nothing to do */
return (0);
}
/* OK, now reset the FIFO */
return (2); /* This is really amazingly bad */
}
return (2);
}
}
for (limit = 10000;
;
}
if (!(status & GUI_ACTIVE)) {
return (0);
}
return (1);
}
/* Short loop timed out, make a slower loop up to 3 seconds */
for (limit = 1000000;
efb_delay(1);
}
if (!(status & GUI_ACTIVE)) {
return (0);
}
return (1);
}
"efb: %s:%d: efb_wait_idle: idle timeout status=%x",
return (2); /* This is really amazingly bad */
}
return (0);
}
static int
{
int rval;
uint32_t s;
return (rval);
}
/* dummy read to flush the write */
return (rval);
}
return (rval);
}
return (rval);
}
return (rval);
}
void
{
#if VIS_CONS_REV > 2
extern int efb_in_polledio;
if (efb_in_polledio) {
if (ticks <= 0)
ticks = 1;
} else {
}
#else
#endif
}