]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/gpu/drm/ast/ast_main.c
drm/ast: Remove spurious include
[karo-tx-linux.git] / drivers / gpu / drm / ast / ast_main.c
1 /*
2  * Copyright 2012 Red Hat Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sub license, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
15  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
16  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
17  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
18  * USE OR OTHER DEALINGS IN THE SOFTWARE.
19  *
20  * The above copyright notice and this permission notice (including the
21  * next paragraph) shall be included in all copies or substantial portions
22  * of the Software.
23  *
24  */
25 /*
26  * Authors: Dave Airlie <airlied@redhat.com>
27  */
28 #include <drm/drmP.h>
29 #include "ast_drv.h"
30
31
32 #include <drm/drm_fb_helper.h>
33 #include <drm/drm_crtc_helper.h>
34
35 void ast_set_index_reg_mask(struct ast_private *ast,
36                             uint32_t base, uint8_t index,
37                             uint8_t mask, uint8_t val)
38 {
39         u8 tmp;
40         ast_io_write8(ast, base, index);
41         tmp = (ast_io_read8(ast, base + 1) & mask) | val;
42         ast_set_index_reg(ast, base, index, tmp);
43 }
44
45 uint8_t ast_get_index_reg(struct ast_private *ast,
46                           uint32_t base, uint8_t index)
47 {
48         uint8_t ret;
49         ast_io_write8(ast, base, index);
50         ret = ast_io_read8(ast, base + 1);
51         return ret;
52 }
53
54 uint8_t ast_get_index_reg_mask(struct ast_private *ast,
55                                uint32_t base, uint8_t index, uint8_t mask)
56 {
57         uint8_t ret;
58         ast_io_write8(ast, base, index);
59         ret = ast_io_read8(ast, base + 1) & mask;
60         return ret;
61 }
62
63 static void ast_detect_config_mode(struct drm_device *dev, u32 *scu_rev)
64 {
65         struct device_node *np = dev->pdev->dev.of_node;
66         struct ast_private *ast = dev->dev_private;
67         uint32_t data, jregd0, jregd1;
68
69         /* Defaults */
70         ast->config_mode = ast_use_defaults;
71         *scu_rev = 0xffffffff;
72
73         /* Check if we have device-tree properties */
74         if (np && !of_property_read_u32(np, "aspeed,scu-revision-id",
75                                         scu_rev)) {
76                 /* We do, disable P2A access */
77                 ast->config_mode = ast_use_dt;
78                 DRM_INFO("Using device-tree for configuration\n");
79                 return;
80         }
81
82         /* Not all families have a P2A bridge */
83         if (dev->pdev->device != PCI_CHIP_AST2000)
84                 return;
85
86         /*
87          * The BMC will set SCU 0x40 D[12] to 1 if the P2 bridge
88          * is disabled. We force using P2A if VGA only mode bit
89          * is set D[7]
90          */
91         jregd0 = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
92         jregd1 = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff);
93         if (!(jregd0 & 0x80) || !(jregd1 & 0x10)) {
94                 /* Double check it's actually working */
95                 data = ast_read32(ast, 0xf004);
96                 if (data != 0xFFFFFFFF) {
97                         /* P2A works, grab silicon revision */
98                         ast->config_mode = ast_use_p2a;
99
100                         DRM_INFO("Using P2A bridge for configuration\n");
101
102                         /* Read SCU7c (silicon revision register) */
103                         ast_write32(ast, 0xf004, 0x1e6e0000);
104                         ast_write32(ast, 0xf000, 0x1);
105                         *scu_rev = ast_read32(ast, 0x1207c);
106                         return;
107                 }
108         }
109
110         /* We have a P2A bridge but it's disabled */
111         DRM_INFO("P2A bridge disabled, using default configuration\n");
112 }
113
114 static int ast_detect_chip(struct drm_device *dev, bool *need_post)
115 {
116         struct ast_private *ast = dev->dev_private;
117         uint32_t jreg, scu_rev;
118
119         /*
120          * If VGA isn't enabled, we need to enable now or subsequent
121          * access to the scratch registers will fail. We also inform
122          * our caller that it needs to POST the chip
123          * (Assumption: VGA not enabled -> need to POST)
124          */
125         if (!ast_is_vga_enabled(dev)) {
126                 ast_enable_vga(dev);
127                 DRM_INFO("VGA not enabled on entry, requesting chip POST\n");
128                 *need_post = true;
129         } else
130                 *need_post = false;
131
132
133         /* Enable extended register access */
134         ast_enable_mmio(dev);
135         ast_open_key(ast);
136
137         /* Find out whether P2A works or whether to use device-tree */
138         ast_detect_config_mode(dev, &scu_rev);
139
140         /* Identify chipset */
141         if (dev->pdev->device == PCI_CHIP_AST1180) {
142                 ast->chip = AST1100;
143                 DRM_INFO("AST 1180 detected\n");
144         } else {
145                 if (dev->pdev->revision >= 0x30) {
146                         ast->chip = AST2400;
147                         DRM_INFO("AST 2400 detected\n");
148                 } else if (dev->pdev->revision >= 0x20) {
149                         ast->chip = AST2300;
150                         DRM_INFO("AST 2300 detected\n");
151                 } else if (dev->pdev->revision >= 0x10) {
152                         switch (scu_rev & 0x0300) {
153                         case 0x0200:
154                                 ast->chip = AST1100;
155                                 DRM_INFO("AST 1100 detected\n");
156                                 break;
157                         case 0x0100:
158                                 ast->chip = AST2200;
159                                 DRM_INFO("AST 2200 detected\n");
160                                 break;
161                         case 0x0000:
162                                 ast->chip = AST2150;
163                                 DRM_INFO("AST 2150 detected\n");
164                                 break;
165                         default:
166                                 ast->chip = AST2100;
167                                 DRM_INFO("AST 2100 detected\n");
168                                 break;
169                         }
170                         ast->vga2_clone = false;
171                 } else {
172                         ast->chip = AST2000;
173                         DRM_INFO("AST 2000 detected\n");
174                 }
175         }
176
177         /* Check if we support wide screen */
178         switch (ast->chip) {
179         case AST1180:
180                 ast->support_wide_screen = true;
181                 break;
182         case AST2000:
183                 ast->support_wide_screen = false;
184                 break;
185         default:
186                 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
187                 if (!(jreg & 0x80))
188                         ast->support_wide_screen = true;
189                 else if (jreg & 0x01)
190                         ast->support_wide_screen = true;
191                 else {
192                         ast->support_wide_screen = false;
193                         if (ast->chip == AST2300 &&
194                             (scu_rev & 0x300) == 0x0) /* ast1300 */
195                                 ast->support_wide_screen = true;
196                         if (ast->chip == AST2400 &&
197                             (scu_rev & 0x300) == 0x100) /* ast1400 */
198                                 ast->support_wide_screen = true;
199                 }
200                 break;
201         }
202
203         /* Check 3rd Tx option (digital output afaik) */
204         ast->tx_chip_type = AST_TX_NONE;
205
206         /*
207          * VGACRA3 Enhanced Color Mode Register, check if DVO is already
208          * enabled, in that case, assume we have a SIL164 TMDS transmitter
209          *
210          * Don't make that assumption if we the chip wasn't enabled and
211          * is at power-on reset, otherwise we'll incorrectly "detect" a
212          * SIL164 when there is none.
213          */
214         if (!*need_post) {
215                 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xff);
216                 if (jreg & 0x80)
217                         ast->tx_chip_type = AST_TX_SIL164;
218         }
219
220         if ((ast->chip == AST2300) || (ast->chip == AST2400)) {
221                 /*
222                  * On AST2300 and 2400, look the configuration set by the SoC in
223                  * the SOC scratch register #1 bits 11:8 (interestingly marked
224                  * as "reserved" in the spec)
225                  */
226                 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff);
227                 switch (jreg) {
228                 case 0x04:
229                         ast->tx_chip_type = AST_TX_SIL164;
230                         break;
231                 case 0x08:
232                         ast->dp501_fw_addr = kzalloc(32*1024, GFP_KERNEL);
233                         if (ast->dp501_fw_addr) {
234                                 /* backup firmware */
235                                 if (ast_backup_fw(dev, ast->dp501_fw_addr, 32*1024)) {
236                                         kfree(ast->dp501_fw_addr);
237                                         ast->dp501_fw_addr = NULL;
238                                 }
239                         }
240                         /* fallthrough */
241                 case 0x0c:
242                         ast->tx_chip_type = AST_TX_DP501;
243                 }
244         }
245
246         /* Print stuff for diagnostic purposes */
247         switch(ast->tx_chip_type) {
248         case AST_TX_SIL164:
249                 DRM_INFO("Using Sil164 TMDS transmitter\n");
250                 break;
251         case AST_TX_DP501:
252                 DRM_INFO("Using DP501 DisplayPort transmitter\n");
253                 break;
254         default:
255                 DRM_INFO("Analog VGA only\n");
256         }
257         return 0;
258 }
259
260 static int ast_get_dram_info(struct drm_device *dev)
261 {
262         struct device_node *np = dev->pdev->dev.of_node;
263         struct ast_private *ast = dev->dev_private;
264         uint32_t mcr_cfg, mcr_scu_mpll, mcr_scu_strap;
265         uint32_t denum, num, div, ref_pll, dsel;
266
267         switch (ast->config_mode) {
268         case ast_use_dt:
269                 /*
270                  * If some properties are missing, use reasonable
271                  * defaults for AST2400
272                  */
273                 if (of_property_read_u32(np, "aspeed,mcr-configuration",
274                                          &mcr_cfg))
275                         mcr_cfg = 0x00000577;
276                 if (of_property_read_u32(np, "aspeed,mcr-scu-mpll",
277                                          &mcr_scu_mpll))
278                         mcr_scu_mpll = 0x000050C0;
279                 if (of_property_read_u32(np, "aspeed,mcr-scu-strap",
280                                          &mcr_scu_strap))
281                         mcr_scu_strap = 0;
282                 break;
283         case ast_use_p2a:
284                 ast_write32(ast, 0xf004, 0x1e6e0000);
285                 ast_write32(ast, 0xf000, 0x1);
286                 mcr_cfg = ast_read32(ast, 0x10004);
287                 mcr_scu_mpll = ast_read32(ast, 0x10120);
288                 mcr_scu_strap = ast_read32(ast, 0x10170);
289                 break;
290         case ast_use_defaults:
291         default:
292                 ast->dram_bus_width = 16;
293                 ast->dram_type = AST_DRAM_1Gx16;
294                 ast->mclk = 396;
295                 return 0;
296         }
297
298         if (mcr_cfg & 0x40)
299                 ast->dram_bus_width = 16;
300         else
301                 ast->dram_bus_width = 32;
302
303         if (ast->chip == AST2300 || ast->chip == AST2400) {
304                 switch (mcr_cfg & 0x03) {
305                 case 0:
306                         ast->dram_type = AST_DRAM_512Mx16;
307                         break;
308                 default:
309                 case 1:
310                         ast->dram_type = AST_DRAM_1Gx16;
311                         break;
312                 case 2:
313                         ast->dram_type = AST_DRAM_2Gx16;
314                         break;
315                 case 3:
316                         ast->dram_type = AST_DRAM_4Gx16;
317                         break;
318                 }
319         } else {
320                 switch (mcr_cfg & 0x0c) {
321                 case 0:
322                 case 4:
323                         ast->dram_type = AST_DRAM_512Mx16;
324                         break;
325                 case 8:
326                         if (mcr_cfg & 0x40)
327                                 ast->dram_type = AST_DRAM_1Gx16;
328                         else
329                                 ast->dram_type = AST_DRAM_512Mx32;
330                         break;
331                 case 0xc:
332                         ast->dram_type = AST_DRAM_1Gx32;
333                         break;
334                 }
335         }
336
337         if (mcr_scu_strap & 0x2000)
338                 ref_pll = 14318;
339         else
340                 ref_pll = 12000;
341
342         denum = mcr_scu_mpll & 0x1f;
343         num = (mcr_scu_mpll & 0x3fe0) >> 5;
344         dsel = (mcr_scu_mpll & 0xc000) >> 14;
345         switch (dsel) {
346         case 3:
347                 div = 0x4;
348                 break;
349         case 2:
350         case 1:
351                 div = 0x2;
352                 break;
353         default:
354                 div = 0x1;
355                 break;
356         }
357         ast->mclk = ref_pll * (num + 2) / (denum + 2) * (div * 1000);
358         return 0;
359 }
360
361 static void ast_user_framebuffer_destroy(struct drm_framebuffer *fb)
362 {
363         struct ast_framebuffer *ast_fb = to_ast_framebuffer(fb);
364
365         drm_gem_object_unreference_unlocked(ast_fb->obj);
366         drm_framebuffer_cleanup(fb);
367         kfree(fb);
368 }
369
370 static const struct drm_framebuffer_funcs ast_fb_funcs = {
371         .destroy = ast_user_framebuffer_destroy,
372 };
373
374
375 int ast_framebuffer_init(struct drm_device *dev,
376                          struct ast_framebuffer *ast_fb,
377                          const struct drm_mode_fb_cmd2 *mode_cmd,
378                          struct drm_gem_object *obj)
379 {
380         int ret;
381
382         drm_helper_mode_fill_fb_struct(dev, &ast_fb->base, mode_cmd);
383         ast_fb->obj = obj;
384         ret = drm_framebuffer_init(dev, &ast_fb->base, &ast_fb_funcs);
385         if (ret) {
386                 DRM_ERROR("framebuffer init failed %d\n", ret);
387                 return ret;
388         }
389         return 0;
390 }
391
392 static struct drm_framebuffer *
393 ast_user_framebuffer_create(struct drm_device *dev,
394                struct drm_file *filp,
395                const struct drm_mode_fb_cmd2 *mode_cmd)
396 {
397         struct drm_gem_object *obj;
398         struct ast_framebuffer *ast_fb;
399         int ret;
400
401         obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]);
402         if (obj == NULL)
403                 return ERR_PTR(-ENOENT);
404
405         ast_fb = kzalloc(sizeof(*ast_fb), GFP_KERNEL);
406         if (!ast_fb) {
407                 drm_gem_object_unreference_unlocked(obj);
408                 return ERR_PTR(-ENOMEM);
409         }
410
411         ret = ast_framebuffer_init(dev, ast_fb, mode_cmd, obj);
412         if (ret) {
413                 drm_gem_object_unreference_unlocked(obj);
414                 kfree(ast_fb);
415                 return ERR_PTR(ret);
416         }
417         return &ast_fb->base;
418 }
419
420 static const struct drm_mode_config_funcs ast_mode_funcs = {
421         .fb_create = ast_user_framebuffer_create,
422 };
423
424 static u32 ast_get_vram_info(struct drm_device *dev)
425 {
426         struct ast_private *ast = dev->dev_private;
427         u8 jreg;
428         u32 vram_size;
429         ast_open_key(ast);
430
431         vram_size = AST_VIDMEM_DEFAULT_SIZE;
432         jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xaa, 0xff);
433         switch (jreg & 3) {
434         case 0: vram_size = AST_VIDMEM_SIZE_8M; break;
435         case 1: vram_size = AST_VIDMEM_SIZE_16M; break;
436         case 2: vram_size = AST_VIDMEM_SIZE_32M; break;
437         case 3: vram_size = AST_VIDMEM_SIZE_64M; break;
438         }
439
440         jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x99, 0xff);
441         switch (jreg & 0x03) {
442         case 1:
443                 vram_size -= 0x100000;
444                 break;
445         case 2:
446                 vram_size -= 0x200000;
447                 break;
448         case 3:
449                 vram_size -= 0x400000;
450                 break;
451         }
452
453         return vram_size;
454 }
455
456 int ast_driver_load(struct drm_device *dev, unsigned long flags)
457 {
458         struct ast_private *ast;
459         bool need_post;
460         int ret = 0;
461
462         ast = kzalloc(sizeof(struct ast_private), GFP_KERNEL);
463         if (!ast)
464                 return -ENOMEM;
465
466         dev->dev_private = ast;
467         ast->dev = dev;
468
469         ast->regs = pci_iomap(dev->pdev, 1, 0);
470         if (!ast->regs) {
471                 ret = -EIO;
472                 goto out_free;
473         }
474
475         /*
476          * If we don't have IO space at all, use MMIO now and
477          * assume the chip has MMIO enabled by default (rev 0x20
478          * and higher).
479          */
480         if (!(pci_resource_flags(dev->pdev, 2) & IORESOURCE_IO)) {
481                 DRM_INFO("platform has no IO space, trying MMIO\n");
482                 ast->ioregs = ast->regs + AST_IO_MM_OFFSET;
483         }
484
485         /* "map" IO regs if the above hasn't done so already */
486         if (!ast->ioregs) {
487                 ast->ioregs = pci_iomap(dev->pdev, 2, 0);
488                 if (!ast->ioregs) {
489                         ret = -EIO;
490                         goto out_free;
491                 }
492         }
493
494         ast_detect_chip(dev, &need_post);
495
496         if (ast->chip != AST1180) {
497                 ret = ast_get_dram_info(dev);
498                 if (ret)
499                         goto out_free;
500                 ast->vram_size = ast_get_vram_info(dev);
501                 DRM_INFO("dram %d %d %d %08x\n", ast->mclk, ast->dram_type, ast->dram_bus_width, ast->vram_size);
502         }
503
504         if (need_post)
505                 ast_post_gpu(dev);
506
507         ret = ast_mm_init(ast);
508         if (ret)
509                 goto out_free;
510
511         drm_mode_config_init(dev);
512
513         dev->mode_config.funcs = (void *)&ast_mode_funcs;
514         dev->mode_config.min_width = 0;
515         dev->mode_config.min_height = 0;
516         dev->mode_config.preferred_depth = 24;
517         dev->mode_config.prefer_shadow = 1;
518         dev->mode_config.fb_base = pci_resource_start(ast->dev->pdev, 0);
519
520         if (ast->chip == AST2100 ||
521             ast->chip == AST2200 ||
522             ast->chip == AST2300 ||
523             ast->chip == AST2400 ||
524             ast->chip == AST1180) {
525                 dev->mode_config.max_width = 1920;
526                 dev->mode_config.max_height = 2048;
527         } else {
528                 dev->mode_config.max_width = 1600;
529                 dev->mode_config.max_height = 1200;
530         }
531
532         ret = ast_mode_init(dev);
533         if (ret)
534                 goto out_free;
535
536         ret = ast_fbdev_init(dev);
537         if (ret)
538                 goto out_free;
539
540         return 0;
541 out_free:
542         kfree(ast);
543         dev->dev_private = NULL;
544         return ret;
545 }
546
547 void ast_driver_unload(struct drm_device *dev)
548 {
549         struct ast_private *ast = dev->dev_private;
550
551         kfree(ast->dp501_fw_addr);
552         ast_mode_fini(dev);
553         ast_fbdev_fini(dev);
554         drm_mode_config_cleanup(dev);
555
556         ast_mm_fini(ast);
557         pci_iounmap(dev->pdev, ast->ioregs);
558         pci_iounmap(dev->pdev, ast->regs);
559         kfree(ast);
560 }
561
562 int ast_gem_create(struct drm_device *dev,
563                    u32 size, bool iskernel,
564                    struct drm_gem_object **obj)
565 {
566         struct ast_bo *astbo;
567         int ret;
568
569         *obj = NULL;
570
571         size = roundup(size, PAGE_SIZE);
572         if (size == 0)
573                 return -EINVAL;
574
575         ret = ast_bo_create(dev, size, 0, 0, &astbo);
576         if (ret) {
577                 if (ret != -ERESTARTSYS)
578                         DRM_ERROR("failed to allocate GEM object\n");
579                 return ret;
580         }
581         *obj = &astbo->gem;
582         return 0;
583 }
584
585 int ast_dumb_create(struct drm_file *file,
586                     struct drm_device *dev,
587                     struct drm_mode_create_dumb *args)
588 {
589         int ret;
590         struct drm_gem_object *gobj;
591         u32 handle;
592
593         args->pitch = args->width * ((args->bpp + 7) / 8);
594         args->size = args->pitch * args->height;
595
596         ret = ast_gem_create(dev, args->size, false,
597                              &gobj);
598         if (ret)
599                 return ret;
600
601         ret = drm_gem_handle_create(file, gobj, &handle);
602         drm_gem_object_unreference_unlocked(gobj);
603         if (ret)
604                 return ret;
605
606         args->handle = handle;
607         return 0;
608 }
609
610 static void ast_bo_unref(struct ast_bo **bo)
611 {
612         struct ttm_buffer_object *tbo;
613
614         if ((*bo) == NULL)
615                 return;
616
617         tbo = &((*bo)->bo);
618         ttm_bo_unref(&tbo);
619         *bo = NULL;
620 }
621
622 void ast_gem_free_object(struct drm_gem_object *obj)
623 {
624         struct ast_bo *ast_bo = gem_to_ast_bo(obj);
625
626         ast_bo_unref(&ast_bo);
627 }
628
629
630 static inline u64 ast_bo_mmap_offset(struct ast_bo *bo)
631 {
632         return drm_vma_node_offset_addr(&bo->bo.vma_node);
633 }
634 int
635 ast_dumb_mmap_offset(struct drm_file *file,
636                      struct drm_device *dev,
637                      uint32_t handle,
638                      uint64_t *offset)
639 {
640         struct drm_gem_object *obj;
641         struct ast_bo *bo;
642
643         obj = drm_gem_object_lookup(file, handle);
644         if (obj == NULL)
645                 return -ENOENT;
646
647         bo = gem_to_ast_bo(obj);
648         *offset = ast_bo_mmap_offset(bo);
649
650         drm_gem_object_unreference_unlocked(obj);
651
652         return 0;
653
654 }
655