Merge branch 'modesetting-101' of git+ssh://git.freedesktop.org/git/mesa/drm into origin/modesetting-101

main
Jesse Barnes 2007-04-11 20:41:54 -07:00
commit e8bd9fdf31
9 changed files with 119 additions and 92 deletions

View File

@ -106,7 +106,7 @@ void drmModeFreeResources(drmModeResPtr ptr)
} }
void drmModeFreeFrameBuffer(drmModeFrameBufferPtr ptr) void drmModeFreeFB(drmModeFBPtr ptr)
{ {
if (!ptr) if (!ptr)
return; return;
@ -215,53 +215,35 @@ int drmModeRmFB(int fd, uint32_t bufferId)
return ioctl(fd, DRM_IOCTL_MODE_RMFB, bufferId); return ioctl(fd, DRM_IOCTL_MODE_RMFB, bufferId);
} }
drmModeFBPtr drmModeGetFB(int fd, uint32_t buf)
{
struct drm_mode_fb_cmd info;
drmModeFBPtr r;
info.buffer_id = buf;
if (ioctl(fd, DRM_IOCTL_MODE_GETFB, &info))
return NULL;
if (!(r = drmMalloc(sizeof(*r))))
return NULL;
r->buffer_id = info.buffer_id;
r->width = info.width;
r->height = info.height;
r->pitch = info.pitch;
r->bpp = info.bpp;
r->handle = info.handle;
r->depth = info.depth;
return r;
}
#if 0 #if 0
int drmModeForceProbe(int fd, uint32_t outputId) int drmModeForceProbe(int fd, uint32_t outputId)
{ {
/* TODO impl/keep? */ /* TODO impl/keep? */
} }
drmModeFrameBufferPtr drmModeGetFrameBuffer(int fd, uint32_t buf)
{
// struct drm_mode_fb_cmd info;
drmModeFrameBufferPtr r;
// if (ioctl(fd, DRM_IOCTL_MODE_GETFRAMEBUFFER, &info))
return 0;
if (!(r = drmMalloc(sizeof(*r))))
return 0;
/* TODO change to new code
r->minWidth = info.minWidth;
r->maxWidth = info.maxWidth;
r->minHeight = info.minHeight;
r->maxHeight = info.maxHeight;*/
return r;
}
uint32_t drmModeNewFrameBuffer(int fd, uint32_t width, uint32_t height,
uint8_t bpp, uint32_t pitch, drmBO *bo)
{
drm_mode_fb_cmd_t f;
f.handle = bo->handle;
f.width = width;
f.height = height;
f.pitch = pitch;
// if (ioctl(fd, DRM_IOCTL_MODE_NEWFRAMEBUFFER, &f))
return 0;
return f.bufferId;
}
int drmModeDesFrameBuffer(int fd, uint32_t bufferId)
{
// return ioctl(fd, DRM_IOCTL_MODE_DESFRAMEBUFFER, bufferId);
}
#endif #endif
/* /*
* Crtc function. * Crtc function.
@ -294,7 +276,7 @@ drmModeCrtcPtr drmModeGetCrtc(int fd, uint32_t crtcId)
r->mode = crtc.mode; r->mode = crtc.mode;
// r->width = crtc.width; // r->width = crtc.width;
// r->height = crtc.height; // r->height = crtc.height;
r->bufferId = crtc.fb_id; r->buffer_id = crtc.fb_id;
r->gamma_size = crtc.gamma_size; r->gamma_size = crtc.gamma_size;
r->count_outputs = crtc.count_outputs; r->count_outputs = crtc.count_outputs;
r->count_possibles = crtc.count_possibles; r->count_possibles = crtc.count_possibles;

View File

@ -76,18 +76,11 @@ typedef struct _drmModeRes {
} drmModeRes, *drmModeResPtr; } drmModeRes, *drmModeResPtr;
typedef struct _drmModeFrameBuffer { typedef struct drm_mode_fb_cmd drmModeFB, *drmModeFBPtr;
uint32_t width;
uint32_t height;
uint32_t pitch;
uint8_t bpp;
} drmModeFrameBuffer, *drmModeFrameBufferPtr;
typedef struct _drmModeCrtc { typedef struct _drmModeCrtc {
unsigned int bufferId; /**< Buffer currently connected to */ unsigned int buffer_id; /**< FB id to connect to 0 = disconnect*/
uint32_t x, y; /**< Position on the frameuffer */ uint32_t x, y; /**< Position on the frameuffer */
uint32_t width, height; uint32_t width, height;
@ -187,7 +180,7 @@ typedef struct _drmModeOutput {
extern void drmModeFreeModeInfo( struct drm_mode_modeinfo *ptr ); extern void drmModeFreeModeInfo( struct drm_mode_modeinfo *ptr );
extern void drmModeFreeResources( drmModeResPtr ptr ); extern void drmModeFreeResources( drmModeResPtr ptr );
extern void drmModeFreeFrameBuffer( drmModeFrameBufferPtr ptr ); extern void drmModeFreeFB( drmModeFBPtr ptr );
extern void drmModeFreeCrtc( drmModeCrtcPtr ptr ); extern void drmModeFreeCrtc( drmModeCrtcPtr ptr );
extern void drmModeFreeOutput( drmModeOutputPtr ptr ); extern void drmModeFreeOutput( drmModeOutputPtr ptr );
@ -209,14 +202,14 @@ extern int drmModeForceProbe(int fd, uint32_t outputId);
/** /**
* Retrive information about framebuffer bufferId * Retrive information about framebuffer bufferId
*/ */
extern drmModeFrameBufferPtr drmModeGetFB(int fd, extern drmModeFBPtr drmModeGetFB(int fd, uint32_t bufferId);
uint32_t bufferId);
/** /**
* Creates a new framebuffer with an buffer object as its scanout buffer. * Creates a new framebuffer with an buffer object as its scanout buffer.
*/ */
extern int drmModeAddFB(int fd, uint32_t width, uint32_t height, uint8_t depth, extern int drmModeAddFB(int fd, uint32_t width, uint32_t height, uint8_t depth,
uint8_t bpp, uint32_t pitch, drmBO *bo, uint32_t *buf_id); uint8_t bpp, uint32_t pitch, drmBO *bo,
uint32_t *buf_id);
/** /**
* Destroies the given framebuffer. * Destroies the given framebuffer.
*/ */

View File

@ -37,6 +37,7 @@ struct drm_framebuffer *drm_framebuffer_create(drm_device_t *dev)
spin_lock(&dev->mode_config.config_lock); spin_lock(&dev->mode_config.config_lock);
/* Limit to single framebuffer for now */ /* Limit to single framebuffer for now */
if (dev->mode_config.num_fb > 1) { if (dev->mode_config.num_fb > 1) {
spin_unlock(&dev->mode_config.config_lock);
DRM_ERROR("Attempt to add multiple framebuffers failed\n"); DRM_ERROR("Attempt to add multiple framebuffers failed\n");
return NULL; return NULL;
} }
@ -253,8 +254,7 @@ bool drm_crtc_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode,
/* Now, enable the clocks, plane, pipe, and outputs that we set up. */ /* Now, enable the clocks, plane, pipe, and outputs that we set up. */
crtc->funcs->commit(crtc); crtc->funcs->commit(crtc);
list_for_each_entry(output, &dev->mode_config.output_list, head) { list_for_each_entry(output, &dev->mode_config.output_list, head) {
if (output->crtc == crtc) if (output->crtc == crtc) {
{
output->funcs->commit(output); output->funcs->commit(output);
#if 0 // TODO def RANDR_12_INTERFACE #if 0 // TODO def RANDR_12_INTERFACE
if (output->randr_output) if (output->randr_output)
@ -542,6 +542,9 @@ bool drm_initial_config(drm_device_t *dev, struct drm_framebuffer *fb,
list_for_each_entry(output, &dev->mode_config.output_list, head) { list_for_each_entry(output, &dev->mode_config.output_list, head) {
struct drm_display_mode *des_mode; struct drm_display_mode *des_mode;
if (list_empty(&output->modes))
continue;
/* Get the first preferred moded */ /* Get the first preferred moded */
list_for_each_entry(des_mode, &output->modes, head) { list_for_each_entry(des_mode, &output->modes, head) {
if (des_mode->flags & DRM_MODE_TYPE_PREFERRED) if (des_mode->flags & DRM_MODE_TYPE_PREFERRED)
@ -579,7 +582,7 @@ void drm_mode_config_cleanup(drm_device_t *dev)
{ {
struct drm_output *output, *ot; struct drm_output *output, *ot;
struct drm_crtc *crtc, *ct; struct drm_crtc *crtc, *ct;
struct drm_crtc *fb, *fbt;
list_for_each_entry_safe(output, ot, &dev->mode_config.output_list, head) { list_for_each_entry_safe(output, ot, &dev->mode_config.output_list, head) {
drm_output_destroy(output); drm_output_destroy(output);
} }
@ -587,10 +590,15 @@ void drm_mode_config_cleanup(drm_device_t *dev)
list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) {
drm_crtc_destroy(crtc); drm_crtc_destroy(crtc);
} }
list_for_each_entry_safe(fb, fbt, &dev->mode_config.fb_list, head) {
drmfb_remove(dev, fb);
drm_framebuffer_destroy(fb);
}
} }
EXPORT_SYMBOL(drm_mode_config_cleanup); EXPORT_SYMBOL(drm_mode_config_cleanup);
int drm_crtc_set_config(struct drm_crtc *crtc, struct drm_mode_crtc *crtc_info, struct drm_display_mode *new_mode, struct drm_output **output_set) int drm_crtc_set_config(struct drm_crtc *crtc, struct drm_mode_crtc *crtc_info, struct drm_display_mode *new_mode, struct drm_output **output_set, struct drm_framebuffer *fb)
{ {
drm_device_t *dev = crtc->dev; drm_device_t *dev = crtc->dev;
struct drm_crtc **save_crtcs, *new_crtc; struct drm_crtc **save_crtcs, *new_crtc;
@ -603,6 +611,9 @@ int drm_crtc_set_config(struct drm_crtc *crtc, struct drm_mode_crtc *crtc_info,
if (!save_crtcs) if (!save_crtcs)
return -ENOMEM; return -ENOMEM;
if (crtc->fb != fb)
changed = true;
if (crtc_info->x != crtc->x || crtc_info->y != crtc->y) if (crtc_info->x != crtc->x || crtc_info->y != crtc->y)
changed = true; changed = true;
@ -617,8 +628,7 @@ int drm_crtc_set_config(struct drm_crtc *crtc, struct drm_mode_crtc *crtc_info,
else else
new_crtc = output->crtc; new_crtc = output->crtc;
for (ro = 0; ro < crtc_info->count_outputs; ro++) for (ro = 0; ro < crtc_info->count_outputs; ro++) {
{
if (output_set[ro] == output) if (output_set[ro] == output)
new_crtc = crtc; new_crtc = crtc;
} }
@ -629,6 +639,7 @@ int drm_crtc_set_config(struct drm_crtc *crtc, struct drm_mode_crtc *crtc_info,
} }
if (changed) { if (changed) {
crtc->fb = fb;
crtc->enabled = (new_mode != NULL); crtc->enabled = (new_mode != NULL);
if (new_mode != NULL) { if (new_mode != NULL) {
DRM_DEBUG("attempting to set mode from userspace\n"); DRM_DEBUG("attempting to set mode from userspace\n");
@ -897,6 +908,7 @@ int drm_mode_setcrtc(struct inode *inode, struct file *filp,
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_output **output_set = NULL, *output; struct drm_output **output_set = NULL, *output;
struct drm_display_mode *mode; struct drm_display_mode *mode;
struct drm_framebuffer *fb = NULL;
int retcode = 0; int retcode = 0;
int i; int i;
@ -904,23 +916,28 @@ int drm_mode_setcrtc(struct inode *inode, struct file *filp,
return -EFAULT; return -EFAULT;
crtc = idr_find(&dev->mode_config.crtc_idr, crtc_req.crtc_id); crtc = idr_find(&dev->mode_config.crtc_idr, crtc_req.crtc_id);
if (!crtc || (crtc->id != crtc_req.crtc_id)) if (!crtc || (crtc->id != crtc_req.crtc_id)) {
{
DRM_DEBUG("Unknown CRTC ID %d\n", crtc_req.crtc_id); DRM_DEBUG("Unknown CRTC ID %d\n", crtc_req.crtc_id);
return -EINVAL; return -EINVAL;
} }
if (crtc_req.mode) { if (crtc_req.mode) {
mode = idr_find(&dev->mode_config.crtc_idr, crtc_req.mode);
if (!mode || (mode->mode_id != crtc_req.mode))
{
{
struct drm_output *output;
list_for_each_entry(output, &dev->mode_config.output_list, head) { /* if we have a mode we need a framebuffer */
list_for_each_entry(mode, &output->modes, head) { if (crtc_req.fb_id) {
drm_mode_debug_printmodeline(dev, mode); fb = idr_find(&dev->mode_config.crtc_idr, crtc_req.fb_id);
} if (!fb || (fb->id != crtc_req.fb_id)) {
DRM_DEBUG("Unknown FB ID%d\n", crtc_req.fb_id);
return -EINVAL;
}
}
mode = idr_find(&dev->mode_config.crtc_idr, crtc_req.mode);
if (!mode || (mode->mode_id != crtc_req.mode)) {
struct drm_output *output;
list_for_each_entry(output, &dev->mode_config.output_list, head) {
list_for_each_entry(mode, &output->modes, head) {
drm_mode_debug_printmodeline(dev, mode);
} }
} }
@ -935,8 +952,8 @@ int drm_mode_setcrtc(struct inode *inode, struct file *filp,
return -EINVAL; return -EINVAL;
} }
if (crtc_req.count_outputs > 0 && !mode) { if (crtc_req.count_outputs > 0 && !mode && !fb) {
DRM_DEBUG("Count outputs is %d but no mode set\n", crtc_req.count_outputs); DRM_DEBUG("Count outputs is %d but no mode or fb set\n", crtc_req.count_outputs);
return -EINVAL; return -EINVAL;
} }
@ -960,7 +977,7 @@ int drm_mode_setcrtc(struct inode *inode, struct file *filp,
} }
} }
retcode = drm_crtc_set_config(crtc, &crtc_req, mode, output_set); retcode = drm_crtc_set_config(crtc, &crtc_req, mode, output_set, fb);
return retcode; return retcode;
} }
@ -1058,3 +1075,33 @@ int drm_mode_rmfb(struct inode *inode, struct file *filp,
return 0; return 0;
} }
int drm_mode_getfb(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev;
struct drm_mode_fb_cmd __user *argp = (void __user *)arg;
struct drm_mode_fb_cmd r;
struct drm_framebuffer *fb;
if (copy_from_user(&r, argp, sizeof(r)))
return -EFAULT;
fb = idr_find(&dev->mode_config.crtc_idr, r.buffer_id);
if (!fb || (r.buffer_id != fb->id)) {
DRM_ERROR("invalid framebuffer id\n");
return -EINVAL;
}
r.height = fb->height;
r.width = fb->width;
r.depth = fb->depth;
r.bpp = fb->bits_per_pixel;
r.handle = fb->bo->base.hash.key;
r.pitch = fb->pitch;
if (copy_to_user(argp, &r, sizeof(r)))
return -EFAULT;
return 0;
}

View File

@ -474,5 +474,7 @@ extern int drm_mode_addfb(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
extern int drm_mode_rmfb(struct inode *inode, struct file *filp, extern int drm_mode_rmfb(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
extern int drm_mode_getfb(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
#endif /* __DRM_CRTC_H__ */ #endif /* __DRM_CRTC_H__ */

View File

@ -129,6 +129,7 @@ static drm_ioctl_desc_t drm_ioctls[] = {
[DRM_IOCTL_NR(DRM_IOCTL_MODE_SETCRTC)] = {drm_mode_setcrtc, DRM_MASTER|DRM_ROOT_ONLY}, [DRM_IOCTL_NR(DRM_IOCTL_MODE_SETCRTC)] = {drm_mode_setcrtc, DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_MODE_ADDFB)] = {drm_mode_addfb, DRM_MASTER|DRM_ROOT_ONLY}, [DRM_IOCTL_NR(DRM_IOCTL_MODE_ADDFB)] = {drm_mode_addfb, DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_MODE_RMFB)] = {drm_mode_rmfb, DRM_MASTER|DRM_ROOT_ONLY}, [DRM_IOCTL_NR(DRM_IOCTL_MODE_RMFB)] = {drm_mode_rmfb, DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_MODE_GETFB)] = {drm_mode_getfb, DRM_MASTER|DRM_ROOT_ONLY},
}; };
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )

View File

@ -77,6 +77,15 @@ static int drmfb_setcolreg(unsigned regno, unsigned red, unsigned green,
return 0; return 0;
} }
/* this will let fbcon do the mode init */
static int drmfb_set_par(struct fb_info *info)
{
struct drmfb_par *par = info->par;
struct drm_device *dev = par->dev;
drm_set_desired_modes(dev);
}
static struct fb_ops drmfb_ops = { static struct fb_ops drmfb_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
// .fb_open = drmfb_open, // .fb_open = drmfb_open,
@ -84,6 +93,7 @@ static struct fb_ops drmfb_ops = {
// .fb_write = drmfb_write, // .fb_write = drmfb_write,
// .fb_release = drmfb_release, // .fb_release = drmfb_release,
// .fb_ioctl = drmfb_ioctl, // .fb_ioctl = drmfb_ioctl,
.fb_set_par = drmfb_set_par,
.fb_setcolreg = drmfb_setcolreg, .fb_setcolreg = drmfb_setcolreg,
.fb_fillrect = cfb_fillrect, .fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,

View File

@ -412,8 +412,7 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
case DPMSModeSuspend: case DPMSModeSuspend:
/* Enable the DPLL */ /* Enable the DPLL */
temp = I915_READ(dpll_reg); temp = I915_READ(dpll_reg);
if ((temp & DPLL_VCO_ENABLE) == 0) if ((temp & DPLL_VCO_ENABLE) == 0) {
{
I915_WRITE(dpll_reg, temp); I915_WRITE(dpll_reg, temp);
I915_READ(dpll_reg); I915_READ(dpll_reg);
/* Wait for the clocks to stabilize. */ /* Wait for the clocks to stabilize. */
@ -435,8 +434,7 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
/* Enable the plane */ /* Enable the plane */
temp = I915_READ(dspcntr_reg); temp = I915_READ(dspcntr_reg);
if ((temp & DISPLAY_PLANE_ENABLE) == 0) if ((temp & DISPLAY_PLANE_ENABLE) == 0) {
{
I915_WRITE(dspcntr_reg, temp | DISPLAY_PLANE_ENABLE); I915_WRITE(dspcntr_reg, temp | DISPLAY_PLANE_ENABLE);
/* Flush the plane changes */ /* Flush the plane changes */
I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
@ -456,8 +454,7 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
/* Disable display plane */ /* Disable display plane */
temp = I915_READ(dspcntr_reg); temp = I915_READ(dspcntr_reg);
if ((temp & DISPLAY_PLANE_ENABLE) != 0) if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
{
I915_WRITE(dspcntr_reg, temp & ~DISPLAY_PLANE_ENABLE); I915_WRITE(dspcntr_reg, temp & ~DISPLAY_PLANE_ENABLE);
/* Flush the plane changes */ /* Flush the plane changes */
I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
@ -719,11 +716,9 @@ static void intel_crtc_mode_set(struct drm_crtc *crtc,
dpll |= DPLLB_MODE_LVDS; dpll |= DPLLB_MODE_LVDS;
else else
dpll |= DPLLB_MODE_DAC_SERIAL; dpll |= DPLLB_MODE_DAC_SERIAL;
if (is_sdvo) if (is_sdvo) {
{
dpll |= DPLL_DVO_HIGH_SPEED; dpll |= DPLL_DVO_HIGH_SPEED;
if (IS_I945G(dev) || IS_I945GM(dev)) if (IS_I945G(dev) || IS_I945GM(dev)) {
{
int sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; int sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES;
} }
@ -760,8 +755,7 @@ static void intel_crtc_mode_set(struct drm_crtc *crtc,
} }
} }
if (is_tv) if (is_tv) {
{
/* XXX: just matching BIOS for now */ /* XXX: just matching BIOS for now */
/* dpll |= PLL_REF_INPUT_TVCLKINBC; */ /* dpll |= PLL_REF_INPUT_TVCLKINBC; */
dpll |= 3; dpll |= 3;
@ -801,8 +795,7 @@ static void intel_crtc_mode_set(struct drm_crtc *crtc,
dspcntr |= DISPPLANE_SEL_PIPE_B; dspcntr |= DISPPLANE_SEL_PIPE_B;
pipeconf = I915_READ(pipeconf_reg); pipeconf = I915_READ(pipeconf_reg);
if (pipe == 0 && !IS_I965G(dev)) if (pipe == 0 && !IS_I965G(dev)) {
{
/* Enable pixel doubling when the dot clock is > 90% of the (display) /* Enable pixel doubling when the dot clock is > 90% of the (display)
* core speed. * core speed.
* *

View File

@ -1051,6 +1051,7 @@ struct drm_mode_fb_cmd {
#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA3, struct drm_mode_crtc) #define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA3, struct drm_mode_crtc)
#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xA4, struct drm_mode_fb_cmd) #define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xA4, struct drm_mode_fb_cmd)
#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xA5, unsigned int) #define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xA5, unsigned int)
#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xA6, struct drm_mode_fb_cmd)
/*@}*/ /*@}*/
/** /**

View File

@ -211,8 +211,6 @@ int i915_driver_load(drm_device_t *dev, unsigned long flags)
drm_initial_config(dev, fb, false); drm_initial_config(dev, fb, false);
drmfb_probe(dev, fb); drmfb_probe(dev, fb);
drm_set_desired_modes(dev);
#if 0 #if 0
/* FIXME: command ring needs AGP space, do we own it at this point? */ /* FIXME: command ring needs AGP space, do we own it at this point? */
dev_priv->ring.Start = dev_priv->baseaddr; dev_priv->ring.Start = dev_priv->baseaddr;