aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Cox <alan@linux.intel.com>2012-05-11 06:30:53 -0400
committerDave Airlie <airlied@redhat.com>2012-05-11 12:35:49 -0400
commit8512e0748729a49d9af6693f920c1b432796fa8d (patch)
tree8d4b90a8391a99ec724f9b004da015768788f783
parentf693dfb72db94cedd5fd2f788b4f2a7c814476de (diff)
gma500: introduce some register maps
All the conditional ugly register selection really wants to be cleaned up. Use a struct describing each pipe and its registers. This will also let us hide some of the oddments between platforms for any future merging of bits together. In particular the way the DPLL and FP registers randomly wander around. Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/gma500/cdv_device.c53
-rw-r--r--drivers/gpu/drm/gma500/mdfld_device.c80
-rw-r--r--drivers/gpu/drm/gma500/oaktrail_device.c51
-rw-r--r--drivers/gpu/drm/gma500/psb_device.c54
-rw-r--r--drivers/gpu/drm/gma500/psb_drv.h31
5 files changed, 268 insertions, 1 deletions
diff --git a/drivers/gpu/drm/gma500/cdv_device.c b/drivers/gpu/drm/gma500/cdv_device.c
index c10f02068d11..ec062e4c3029 100644
--- a/drivers/gpu/drm/gma500/cdv_device.c
+++ b/drivers/gpu/drm/gma500/cdv_device.c
@@ -485,10 +485,63 @@ static void cdv_hotplug_enable(struct drm_device *dev, bool on)
485 } 485 }
486} 486}
487 487
488/* Cedarview */
489static const struct psb_offset cdv_regmap[2] = {
490 {
491 .fp0 = FPA0,
492 .fp1 = FPA1,
493 .cntr = DSPACNTR,
494 .conf = PIPEACONF,
495 .src = PIPEASRC,
496 .dpll = DPLL_A,
497 .htotal = HTOTAL_A,
498 .hblank = HBLANK_A,
499 .hsync = HSYNC_A,
500 .vtotal = VTOTAL_A,
501 .vblank = VBLANK_A,
502 .vsync = VSYNC_A,
503 .stride = DSPASTRIDE,
504 .size = DSPASIZE,
505 .pos = DSPAPOS,
506 .base = DSPABASE,
507 .surf = DSPASURF,
508 .addr = DSPABASE,
509 .status = PIPEASTAT,
510 .linoff = DSPALINOFF,
511 .tileoff = DSPATILEOFF,
512 .palette = PALETTE_A,
513 },
514 {
515 .fp0 = FPB0,
516 .fp1 = FPB1,
517 .cntr = DSPBCNTR,
518 .conf = PIPEBCONF,
519 .src = PIPEBSRC,
520 .dpll = DPLL_B,
521 .htotal = HTOTAL_B,
522 .hblank = HBLANK_B,
523 .hsync = HSYNC_B,
524 .vtotal = VTOTAL_B,
525 .vblank = VBLANK_B,
526 .vsync = VSYNC_B,
527 .stride = DSPBSTRIDE,
528 .size = DSPBSIZE,
529 .pos = DSPBPOS,
530 .base = DSPBBASE,
531 .surf = DSPBSURF,
532 .addr = DSPBBASE,
533 .status = PIPEBSTAT,
534 .linoff = DSPBLINOFF,
535 .tileoff = DSPBTILEOFF,
536 .palette = PALETTE_B,
537 }
538};
539
488static int cdv_chip_setup(struct drm_device *dev) 540static int cdv_chip_setup(struct drm_device *dev)
489{ 541{
490 struct drm_psb_private *dev_priv = dev->dev_private; 542 struct drm_psb_private *dev_priv = dev->dev_private;
491 INIT_WORK(&dev_priv->hotplug_work, cdv_hotplug_work_func); 543 INIT_WORK(&dev_priv->hotplug_work, cdv_hotplug_work_func);
544 dev_priv->regmap = cdv_regmap;
492 cdv_get_core_freq(dev); 545 cdv_get_core_freq(dev);
493 psb_intel_opregion_init(dev); 546 psb_intel_opregion_init(dev);
494 psb_intel_init_bios(dev); 547 psb_intel_init_bios(dev);
diff --git a/drivers/gpu/drm/gma500/mdfld_device.c b/drivers/gpu/drm/gma500/mdfld_device.c
index ef71ed6a22b0..000d316c6afd 100644
--- a/drivers/gpu/drm/gma500/mdfld_device.c
+++ b/drivers/gpu/drm/gma500/mdfld_device.c
@@ -559,6 +559,84 @@ static int mdfld_power_up(struct drm_device *dev)
559 return 0; 559 return 0;
560} 560}
561 561
562/* Medfield */
563static const struct psb_offset mdfld_regmap[3] = {
564 {
565 .fp0 = MRST_FPA0,
566 .fp1 = MRST_FPA1,
567 .cntr = DSPACNTR,
568 .conf = PIPEACONF,
569 .src = PIPEASRC,
570 .dpll = MRST_DPLL_A,
571 .htotal = HTOTAL_A,
572 .hblank = HBLANK_A,
573 .hsync = HSYNC_A,
574 .vtotal = VTOTAL_A,
575 .vblank = VBLANK_A,
576 .vsync = VSYNC_A,
577 .stride = DSPASTRIDE,
578 .size = DSPASIZE,
579 .pos = DSPAPOS,
580 .surf = DSPASURF,
581 .addr = DSPABASE,
582 .status = PIPEASTAT,
583 .linoff = DSPALINOFF,
584 .tileoff = DSPATILEOFF,
585 .palette = PALETTE_A,
586 },
587 {
588 .fp0 = MDFLD_DPLL_DIV0,
589 .cntr = DSPBCNTR,
590 .conf = PIPEBCONF,
591 .src = PIPEBSRC,
592 .dpll = MDFLD_DPLL_B,
593 .htotal = HTOTAL_B,
594 .hblank = HBLANK_B,
595 .hsync = HSYNC_B,
596 .vtotal = VTOTAL_B,
597 .vblank = VBLANK_B,
598 .vsync = VSYNC_B,
599 .stride = DSPBSTRIDE,
600 .size = DSPBSIZE,
601 .pos = DSPBPOS,
602 .surf = DSPBSURF,
603 .addr = DSPBBASE,
604 .status = PIPEBSTAT,
605 .linoff = DSPBLINOFF,
606 .tileoff = DSPBTILEOFF,
607 .palette = PALETTE_B,
608 },
609 {
610 .cntr = DSPCCNTR,
611 .conf = PIPECCONF,
612 .src = PIPECSRC,
613 /* No DPLL_C */
614 .dpll = MRST_DPLL_A,
615 .htotal = HTOTAL_C,
616 .hblank = HBLANK_C,
617 .hsync = HSYNC_C,
618 .vtotal = VTOTAL_C,
619 .vblank = VBLANK_C,
620 .vsync = VSYNC_C,
621 .stride = DSPCSTRIDE,
622 .size = DSPBSIZE,
623 .pos = DSPCPOS,
624 .surf = DSPCSURF,
625 .addr = DSPCBASE,
626 .status = PIPECSTAT,
627 .linoff = DSPCLINOFF,
628 .tileoff = DSPCTILEOFF,
629 .palette = PALETTE_C,
630 },
631};
632
633static int mdfld_chip_setup(struct drm_device *dev)
634{
635 struct drm_psb_private *dev_priv = dev->dev_private;
636 dev_priv->regmap = mdfld_regmap;
637 return mid_chip_setup(dev);
638}
639
562const struct psb_ops mdfld_chip_ops = { 640const struct psb_ops mdfld_chip_ops = {
563 .name = "mdfld", 641 .name = "mdfld",
564 .accel_2d = 0, 642 .accel_2d = 0,
@@ -568,7 +646,7 @@ const struct psb_ops mdfld_chip_ops = {
568 .hdmi_mask = (1 << 1), 646 .hdmi_mask = (1 << 1),
569 .sgx_offset = MRST_SGX_OFFSET, 647 .sgx_offset = MRST_SGX_OFFSET,
570 648
571 .chip_setup = mid_chip_setup, 649 .chip_setup = mdfld_chip_setup,
572 .crtc_helper = &mdfld_helper_funcs, 650 .crtc_helper = &mdfld_helper_funcs,
573 .crtc_funcs = &psb_intel_crtc_funcs, 651 .crtc_funcs = &psb_intel_crtc_funcs,
574 652
diff --git a/drivers/gpu/drm/gma500/oaktrail_device.c b/drivers/gpu/drm/gma500/oaktrail_device.c
index e0b3d49a619a..3c3c862ef61e 100644
--- a/drivers/gpu/drm/gma500/oaktrail_device.c
+++ b/drivers/gpu/drm/gma500/oaktrail_device.c
@@ -456,11 +456,62 @@ static int oaktrail_power_up(struct drm_device *dev)
456 return 0; 456 return 0;
457} 457}
458 458
459/* Oaktrail */
460static const struct psb_offset oaktrail_regmap[2] = {
461 {
462 .fp0 = MRST_FPA0,
463 .fp1 = MRST_FPA1,
464 .cntr = DSPACNTR,
465 .conf = PIPEACONF,
466 .src = PIPEASRC,
467 .dpll = MRST_DPLL_A,
468 .htotal = HTOTAL_A,
469 .hblank = HBLANK_A,
470 .hsync = HSYNC_A,
471 .vtotal = VTOTAL_A,
472 .vblank = VBLANK_A,
473 .vsync = VSYNC_A,
474 .stride = DSPASTRIDE,
475 .size = DSPASIZE,
476 .pos = DSPAPOS,
477 .surf = DSPASURF,
478 .addr = DSPABASE,
479 .status = PIPEASTAT,
480 .linoff = DSPALINOFF,
481 .tileoff = DSPATILEOFF,
482 .palette = PALETTE_A,
483 },
484 {
485 .fp0 = FPB0,
486 .fp1 = FPB1,
487 .cntr = DSPBCNTR,
488 .conf = PIPEBCONF,
489 .src = PIPEBSRC,
490 .dpll = DPLL_B,
491 .htotal = HTOTAL_B,
492 .hblank = HBLANK_B,
493 .hsync = HSYNC_B,
494 .vtotal = VTOTAL_B,
495 .vblank = VBLANK_B,
496 .vsync = VSYNC_B,
497 .stride = DSPBSTRIDE,
498 .size = DSPBSIZE,
499 .pos = DSPBPOS,
500 .surf = DSPBSURF,
501 .addr = DSPBBASE,
502 .status = PIPEBSTAT,
503 .linoff = DSPBLINOFF,
504 .tileoff = DSPBTILEOFF,
505 .palette = PALETTE_B,
506 },
507};
459 508
460static int oaktrail_chip_setup(struct drm_device *dev) 509static int oaktrail_chip_setup(struct drm_device *dev)
461{ 510{
462 struct drm_psb_private *dev_priv = dev->dev_private; 511 struct drm_psb_private *dev_priv = dev->dev_private;
463 int ret; 512 int ret;
513
514 dev_priv->regmap = oaktrail_regmap;
464 515
465 ret = mid_chip_setup(dev); 516 ret = mid_chip_setup(dev);
466 if (ret < 0) 517 if (ret < 0)
diff --git a/drivers/gpu/drm/gma500/psb_device.c b/drivers/gpu/drm/gma500/psb_device.c
index e95cddbceb60..651af6768e14 100644
--- a/drivers/gpu/drm/gma500/psb_device.c
+++ b/drivers/gpu/drm/gma500/psb_device.c
@@ -289,8 +289,62 @@ static void psb_get_core_freq(struct drm_device *dev)
289 } 289 }
290} 290}
291 291
292/* Poulsbo */
293static const struct psb_offset psb_regmap[2] = {
294 {
295 .fp0 = FPA0,
296 .fp1 = FPA1,
297 .cntr = DSPACNTR,
298 .conf = PIPEACONF,
299 .src = PIPEASRC,
300 .dpll = DPLL_A,
301 .htotal = HTOTAL_A,
302 .hblank = HBLANK_A,
303 .hsync = HSYNC_A,
304 .vtotal = VTOTAL_A,
305 .vblank = VBLANK_A,
306 .vsync = VSYNC_A,
307 .stride = DSPASTRIDE,
308 .size = DSPASIZE,
309 .pos = DSPAPOS,
310 .base = DSPABASE,
311 .surf = DSPASURF,
312 .addr = DSPABASE,
313 .status = PIPEASTAT,
314 .linoff = DSPALINOFF,
315 .tileoff = DSPATILEOFF,
316 .palette = PALETTE_A,
317 },
318 {
319 .fp0 = FPB0,
320 .fp1 = FPB1,
321 .cntr = DSPBCNTR,
322 .conf = PIPEBCONF,
323 .src = PIPEBSRC,
324 .dpll = DPLL_B,
325 .htotal = HTOTAL_B,
326 .hblank = HBLANK_B,
327 .hsync = HSYNC_B,
328 .vtotal = VTOTAL_B,
329 .vblank = VBLANK_B,
330 .vsync = VSYNC_B,
331 .stride = DSPBSTRIDE,
332 .size = DSPBSIZE,
333 .pos = DSPBPOS,
334 .base = DSPBBASE,
335 .surf = DSPBSURF,
336 .addr = DSPBBASE,
337 .status = PIPEBSTAT,
338 .linoff = DSPBLINOFF,
339 .tileoff = DSPBTILEOFF,
340 .palette = PALETTE_B,
341 }
342};
343
292static int psb_chip_setup(struct drm_device *dev) 344static int psb_chip_setup(struct drm_device *dev)
293{ 345{
346 struct drm_psb_private *dev_priv = dev->dev_private;
347 dev_priv->regmap = psb_regmap;
294 psb_get_core_freq(dev); 348 psb_get_core_freq(dev);
295 gma_intel_setup_gmbus(dev); 349 gma_intel_setup_gmbus(dev);
296 psb_intel_opregion_init(dev); 350 psb_intel_opregion_init(dev);
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
index e25f9a124796..fd1bc8f6bf97 100644
--- a/drivers/gpu/drm/gma500/psb_drv.h
+++ b/drivers/gpu/drm/gma500/psb_drv.h
@@ -281,6 +281,36 @@ struct intel_gmbus {
281}; 281};
282 282
283/* 283/*
284 * Register offset maps
285 */
286
287struct psb_offset {
288 u32 fp0;
289 u32 fp1;
290 u32 cntr;
291 u32 conf;
292 u32 src;
293 u32 dpll;
294 u32 dpll_md;
295 u32 htotal;
296 u32 hblank;
297 u32 hsync;
298 u32 vtotal;
299 u32 vblank;
300 u32 vsync;
301 u32 stride;
302 u32 size;
303 u32 pos;
304 u32 surf;
305 u32 addr;
306 u32 base;
307 u32 status;
308 u32 linoff;
309 u32 tileoff;
310 u32 palette;
311};
312
313/*
284 * Register save state. This is used to hold the context when the 314 * Register save state. This is used to hold the context when the
285 * device is powered off. In the case of Oaktrail this can (but does not 315 * device is powered off. In the case of Oaktrail this can (but does not
286 * yet) include screen blank. Operations occuring during the save 316 * yet) include screen blank. Operations occuring during the save
@@ -424,6 +454,7 @@ struct psb_ops;
424struct drm_psb_private { 454struct drm_psb_private {
425 struct drm_device *dev; 455 struct drm_device *dev;
426 const struct psb_ops *ops; 456 const struct psb_ops *ops;
457 const struct psb_offset *regmap;
427 458
428 struct child_device_config *child_dev; 459 struct child_device_config *child_dev;
429 int child_dev_num; 460 int child_dev_num;