Rev 1292 | Rev 1311 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1292 | Rev 1310 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* |
1 | /* |
2 | * Copyright (C) 2006-2006 Jakub Vana |
2 | * Copyright (C) 2006 Jakub Vana |
3 | * All rights reserved. |
3 | * All rights reserved. |
4 | * |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
7 | * are met: |
Line 34... | Line 34... | ||
34 | #include <mm/page.h> |
34 | #include <mm/page.h> |
35 | #include <mm/frame.h> |
35 | #include <mm/frame.h> |
36 | #include <mm/as.h> |
36 | #include <mm/as.h> |
37 | #include <arch/mm/page.h> |
37 | #include <arch/mm/page.h> |
38 | #include <synch/spinlock.h> |
38 | #include <synch/spinlock.h> |
39 | #include <arch/types.h> |
- | |
40 | #include <arch/asm.h> |
39 | #include <arch/asm.h> |
- | 40 | #include <arch/types.h> |
|
- | 41 | #include <typedefs.h> |
|
41 | #include <memstr.h> |
42 | #include <memstr.h> |
- | 43 | #include <bitops.h> |
|
42 | 44 | ||
43 | __u32 vesa_ph_addr; |
45 | __u32 vesa_ph_addr; |
44 | __u16 vesa_width; |
46 | __u16 vesa_width; |
45 | __u16 vesa_height; |
47 | __u16 vesa_height; |
46 | __u16 vesa_bpp; |
48 | __u16 vesa_bpp; |
47 | __u16 vesa_scanline; |
49 | __u16 vesa_scanline; |
48 | 50 | ||
49 | - | ||
50 | int vesa_present(void) |
51 | int vesa_present(void) |
51 | { |
52 | { |
52 | if(vesa_width!=0xffff) return true; |
53 | if (vesa_width != 0xffff) |
- | 54 | return true; |
|
53 | if(vesa_height!=0xffff) return true; |
55 | if (vesa_height != 0xffff) |
- | 56 | return true; |
|
54 | return false; |
57 | return false; |
55 | } |
58 | } |
56 | 59 | ||
57 | - | ||
58 | static __u32 log2(__u32 x) |
60 | static count_t vesa_frame_order(void) |
59 | { |
61 | { |
60 | __u32 l=2; |
62 | __u32 x = vesa_scanline*vesa_height; |
61 | if(x<=PAGE_SIZE) return PAGE_WIDTH+1; |
63 | if (x <= FRAME_SIZE) |
- | 64 | return 1; |
|
62 | 65 | ||
63 | x--; |
- | |
64 | while(x>>=1) l++; |
66 | return (fnzb32(x - 1) + 1) - FRAME_WIDTH; |
65 | return l; |
- | |
66 | } |
67 | } |
67 | 68 | ||
68 | void vesa_init(void) |
69 | void vesa_init(void) |
69 | { |
70 | { |
70 | int a; |
71 | int a; |
- | 72 | __address vram_lin_addr; |
|
71 | 73 | ||
72 | __address videoram_lin_addr; |
- | |
73 | - | ||
74 | videoram_lin_addr=PA2KA(PFN2ADDR(frame_alloc( log2(vesa_scanline*vesa_height) -FRAME_WIDTH,FRAME_KA))); |
74 | vram_lin_addr = PA2KA(PFN2ADDR(frame_alloc(vesa_frame_order(), FRAME_KA))); |
75 | /* Map videoram */ |
75 | /* Map videoram */ |
76 | for(a=0;a<((vesa_scanline*vesa_height+PAGE_SIZE-1)>>PAGE_WIDTH);a++) |
76 | for (a = 0; a < ((vesa_scanline * vesa_height + PAGE_SIZE - 1) >> PAGE_WIDTH); a++) |
77 | page_mapping_insert(AS_KERNEL, videoram_lin_addr+a*4096, vesa_ph_addr+a*4096, PAGE_NOT_CACHEABLE); |
77 | page_mapping_insert(AS_KERNEL, vram_lin_addr+a*4096, vesa_ph_addr+a*4096, PAGE_NOT_CACHEABLE); |
78 | 78 | ||
79 | fb_init( videoram_lin_addr,vesa_width,vesa_height,vesa_bpp,vesa_scanline); |
79 | fb_init(vram_lin_addr, vesa_width, vesa_height, vesa_bpp, vesa_scanline); |
80 | } |
80 | } |
81 | 81 | ||
82 | #endif |
82 | #endif |
83 | - |