Changeset 0b414b5 in mainline for kernel/arch/sparc64/src
- Timestamp:
- 2006-10-02T21:07:23Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 233af8c5
- Parents:
- 36db5ac
- Location:
- kernel/arch/sparc64/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/drivers/fhc.c
r36db5ac r0b414b5 42 42 #include <arch/drivers/fhc.h> 43 43 #include <arch/mm/page.h> 44 #include <mm/slab.h> 44 45 #include <arch/types.h> 45 46 #include <typedefs.h> 46 47 #include <genarch/ofw/ofw_tree.h> 47 48 #include <genarch/kbd/z8530.h> 48 49 49 volatile uint32_t *fhc = NULL;50 fhc_t *central_fhc = NULL; 50 51 51 #define FHC_UART_ADDR 0x1fff8808000ULL /* hardcoded for Simics simulation */ 52 /** 53 * I suspect this must be hardcoded in the FHC. 54 * If it is not, than we can read all IMAP registers 55 * and get the complete mapping. 56 */ 57 #define FHC_UART_INO 0x39 52 58 53 59 #define FHC_UART_IMAP 0x0 54 60 #define FHC_UART_ICLR 0x4 55 61 56 void fhc_init(void) 62 #define UART_IMAP_REG 4 63 64 fhc_t *fhc_init(ofw_tree_node_t *node) 57 65 { 58 fhc = (void *) hw_map(FHC_UART_ADDR, PAGE_SIZE); 66 fhc_t *fhc; 67 ofw_tree_property_t *prop; 59 68 60 fhc[FHC_UART_ICLR] = 0; 61 fhc[FHC_UART_IMAP] = 0x80000000; 69 prop = ofw_tree_getprop(node, "reg"); 70 71 if (!prop || !prop->value) 72 return NULL; 73 74 count_t regs = prop->size / sizeof(ofw_central_reg_t); 75 if (regs + 1 < UART_IMAP_REG) 76 return NULL; 77 78 ofw_central_reg_t *reg = &((ofw_central_reg_t *) prop->value)[UART_IMAP_REG]; 79 80 uintptr_t paddr; 81 if (!ofw_central_apply_ranges(node->parent, reg, &paddr)) 82 return NULL; 83 84 fhc = (fhc_t *) malloc(sizeof(fhc_t), FRAME_ATOMIC); 85 if (!fhc) 86 return NULL; 87 88 fhc->uart_imap = (uint32_t *) hw_map(paddr, reg->size); 89 90 return fhc; 62 91 } 63 92 64 void fhc_ uart_reset(void)93 void fhc_enable_interrupt(fhc_t *fhc, int ino) 65 94 { 66 fhc[FHC_UART_ICLR] = 0; 95 switch (ino) { 96 case FHC_UART_INO: 97 fhc->uart_imap[FHC_UART_ICLR] = 0x0; 98 fhc->uart_imap[FHC_UART_IMAP] = 0x80000000; 99 break; 100 default: 101 panic("Unexpected INO (%d)\n", ino); 102 break; 103 } 104 } 105 106 void fhc_clear_interrupt(fhc_t *fhc, int ino) 107 { 108 ASSERT(fhc->uart_imap); 109 110 switch (ino) { 111 case FHC_UART_INO: 112 fhc->uart_imap[FHC_UART_ICLR] = 0; 113 break; 114 default: 115 panic("Unexpected INO (%d)\n", ino); 116 break; 117 } 67 118 } 68 119 -
kernel/arch/sparc64/src/drivers/kbd.c
r36db5ac r0b414b5 69 69 name = ofw_tree_node_name(node); 70 70 71 /* 72 * Determine keyboard serial controller type. 73 */ 71 74 if (strcmp(name, "zs") == 0) 72 75 kbd_type = KBD_Z8530; … … 79 82 } 80 83 84 /* 85 * Read 'interrupts' property. 86 */ 87 uint32_t interrupts; 88 prop = ofw_tree_getprop(node, "interrupts"); 89 if (!prop || !prop->value) 90 panic("Can't find \"interrupts\" property.\n"); 91 interrupts = *((uint32_t *) prop->value); 92 93 /* 94 * Read 'reg' property. 95 */ 81 96 prop = ofw_tree_getprop(node, "reg"); 82 if (!prop )97 if (!prop || !prop->value) 83 98 panic("Can't find \"reg\" property.\n"); 84 99 85 100 uintptr_t pa; 86 101 size_t size; 102 int ino; 87 103 88 104 switch (kbd_type) { … … 93 109 return; 94 110 } 111 if (!ofw_fhc_map_interrupts(node->parent, ((ofw_fhc_reg_t *) prop->value), interrupts, &ino)) { 112 printf("Failed to determine keyboard interrupts.\n"); 113 return; 114 } 95 115 break; 96 116 case KBD_NS16550: … … 98 118 if (!ofw_ebus_apply_ranges(node->parent, ((ofw_ebus_reg_t *) prop->value) , &pa)) { 99 119 printf("Failed to determine keyboard address.\n"); 120 return; 121 } 122 if (!ofw_ebus_map_interrupts(node->parent, ((ofw_ebus_reg_t *) prop->value), interrupts, &ino)) { 123 printf("Failed to determine keyboard interrupts.\n"); 100 124 return; 101 125 } -
kernel/arch/sparc64/src/trap/interrupt.c
r36db5ac r0b414b5 97 97 else 98 98 ipc_irq_send_notif(0); 99 fhc_ uart_reset();99 fhc_clear_interrupt(central_fhc, data0); 100 100 break; 101 101
Note:
See TracChangeset
for help on using the changeset viewer.