Changeset 0b414b5 in mainline for kernel/arch/sparc64/src/drivers/fhc.c
- Timestamp:
- 2006-10-02T21:07:23Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 233af8c5
- Parents:
- 36db5ac
- File:
-
- 1 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
Note:
See TracChangeset
for help on using the changeset viewer.